如何配置 NServiceBus 6 以在 Web API 中使用现有的 StructureMap 容器?
How to configure NServiceBus 6 to use an existing StructureMap container in Web API?
我有一个使用 StructureMap 的 Web API 应用程序,我已经引入了最新版本的 NServiceBus(版本 6)以引入 pub/sub 更改数据。
问题是我似乎无法将现有容器注入到 StructureMapBuilder。
结构如下:
public class WebApiRegistry : Registry
{
public WebApiRegistry()
{
For(typeof(IRepository<>)).Use(typeof(Repository<>));
For(typeof(IProcessor<>)).Use(typeof(PassThroughProcessor<>));
For<IUnitOfWork>().Use<UnitOfWork>();
For<ILog>().Use(container => LogManager.GetLogger("My.WebApi"));
}
}
然后在Global.asax中的Aplication_Start方法中注册这个注册表:
GlobalConfiguration.Configuration.UseStructureMap<WebApiRegistry>();
问题出在这里,同样的方法:
var endpointConfiguration = new EndpointConfiguration("My.WebApi.Sender");
endpointConfiguration.UseTransport<MsmqTransport>();
endpointConfiguration.UseSerialization<NServiceBus.JsonSerializer>();
endpointConfiguration.UsePersistence<InMemoryPersistence>();
endpointConfiguration.UseContainer<StructureMapBuilder>(); //No idea how to get the existing container in here???
endpointConfiguration.SendOnly();
我不知道如何向 NServiceBus 注册现有容器。
我有一个使用 AutoFac 的示例,这可能是因为它是 NServiceBus 选择的默认 DI 框架,但我很想让它与 StructureMap 一起使用。
有什么想法吗?
手动创建容器并将其用于 Web API 和 NServiceBus
var registry = new WebApiRegistry();
var container = new Container(registry);
//Register StructureMap with GlobalConfiguration
GlobalConfiguration.Configuration.UseStructureMap(container);
var endpointConfiguration = new EndpointConfiguration("My.WebApi.Sender");
//...other code removed for brevity
//Configuring NServiceBus to use the container
endpointConfiguration.UseContainer<StructureMapBuilder>(
customizations: customizations => {
customizations.ExistingContainer(container);
});
//...other code removed for brevity
var endpointInstance = await Endpoint.Start(endpointConfiguration);
// OR Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
IMessageSession messageSession = endpointInstance as IMessageSession;
// Now, change the container configuration to know how to resolve IMessageSession
container.Configure(x => x.For<IMessageSession>().Use(messageSession));
我有一个使用 StructureMap 的 Web API 应用程序,我已经引入了最新版本的 NServiceBus(版本 6)以引入 pub/sub 更改数据。
问题是我似乎无法将现有容器注入到 StructureMapBuilder。
结构如下:
public class WebApiRegistry : Registry
{
public WebApiRegistry()
{
For(typeof(IRepository<>)).Use(typeof(Repository<>));
For(typeof(IProcessor<>)).Use(typeof(PassThroughProcessor<>));
For<IUnitOfWork>().Use<UnitOfWork>();
For<ILog>().Use(container => LogManager.GetLogger("My.WebApi"));
}
}
然后在Global.asax中的Aplication_Start方法中注册这个注册表:
GlobalConfiguration.Configuration.UseStructureMap<WebApiRegistry>();
问题出在这里,同样的方法:
var endpointConfiguration = new EndpointConfiguration("My.WebApi.Sender");
endpointConfiguration.UseTransport<MsmqTransport>();
endpointConfiguration.UseSerialization<NServiceBus.JsonSerializer>();
endpointConfiguration.UsePersistence<InMemoryPersistence>();
endpointConfiguration.UseContainer<StructureMapBuilder>(); //No idea how to get the existing container in here???
endpointConfiguration.SendOnly();
我不知道如何向 NServiceBus 注册现有容器。
我有一个使用 AutoFac 的示例,这可能是因为它是 NServiceBus 选择的默认 DI 框架,但我很想让它与 StructureMap 一起使用。
有什么想法吗?
手动创建容器并将其用于 Web API 和 NServiceBus
var registry = new WebApiRegistry();
var container = new Container(registry);
//Register StructureMap with GlobalConfiguration
GlobalConfiguration.Configuration.UseStructureMap(container);
var endpointConfiguration = new EndpointConfiguration("My.WebApi.Sender");
//...other code removed for brevity
//Configuring NServiceBus to use the container
endpointConfiguration.UseContainer<StructureMapBuilder>(
customizations: customizations => {
customizations.ExistingContainer(container);
});
//...other code removed for brevity
var endpointInstance = await Endpoint.Start(endpointConfiguration);
// OR Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
IMessageSession messageSession = endpointInstance as IMessageSession;
// Now, change the container configuration to know how to resolve IMessageSession
container.Configure(x => x.For<IMessageSession>().Use(messageSession));