【问题标题】:How to configure NServiceBus 6 to use an existing StructureMap container in Web API?如何配置 NServiceBus 6 以使用 Web API 中现有的 StructureMap 容器?
【发布时间】:2017-08-10 07:41:29
【问题描述】:

我有一个使用 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 一起使用。

有什么想法吗?

【问题讨论】:

  • 感谢您的回复,但不幸的是,这不起作用:'没有默认实例已注册,并且无法自动确定类型'NServiceBus.IMessageSession'是我调用控制器操作时的结果,即配置为发送。此外,我希望避免在 Global.asax 中重复 WebApiRegistry 代码。
  • 检查提供的答案

标签: c# asp.net-web-api dependency-injection nservicebus structuremap


【解决方案1】:

手动创建容器并将其用于 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));

【讨论】:

  • @BillyRayValentine 看起来 NServiceBus.IMessageSession 默认情况下未在容器中注册,并且仅在您启动端点后可用。所以需要想办法把它放进容器里
  • @BillyRayValentine 我想我明白了。检查更新的答案。
  • 感谢您的帮助。我认为它正在工作,但现在我收到一个奇怪的队列错误:“队列不存在或您没有足够的权限来执行操作”我想我稍后将不得不发布另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多