如何配置 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));