我想知道是否有办法在注册后的任何时候检索autofac容器。我按如下方式注册模块(使用NSB 5.0):
var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacConfigModule());
container = builder.Build();
busConfiguration.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(container));
当我的端点启动时,我注册了一个侦听器(实现IWantToRunWhenBusStartsAndStops),该侦听器从WebSphereMQ
检索消息。为了处理这些消息,我已经定义了一个接口(类似于NServiceBus
IHandleMessages&lt;&gt;),然后我想解决该接口并将反序列化消息传递给进一步处理。为了解决我的自定义界面实现问题,我想使用我已在NServiceBus
注册的容器,但我无法弄清楚如何执行此操作。有没有办法检索它?
答案 0 :(得分:2)
如果在容器中注册了接口,则可以使用构造函数注入来解决它们。考虑这样的事情:
var cfg = new BusConfiguration();
var builder = new ContainerBuilder();
builder.RegisterInstance<IMyCustomHandler>(new MyCustomHandler());
var container = builder.Build();
cfg.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(container));
然后,您可以通过构造函数参数注入IMyCustomHandler
,它应该由NServiceBus自动解析。
这有帮助吗?
答案 1 :(得分:0)
是否可以使用ContainerDefinition
注册您自己的Autofac中间件实现?
http://docs.particular.net/nservicebus/containers/
您可以注册Autofac并将根ILifetimeScope
存储为静态属性,以便在您的应用程序中使用。
类似的东西:
public static class Container
{
public static ILifetimeScope LifetimeScope { get; set; }
}
public class MyContainer : ContainerDefinition
{
public override IContainer CreateContainer(ReadOnlySettings settings)
{
var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacConfigModule());
Container.LifetimeScope = builder.Build();
return Container.LifetimeScope;
}
}
然后使用
解决您的依赖关系Container.LifetimeScope.Resolve<IHandleDeserializedMessages>();
(完全未经测试的示例代码。)