在NServiceBus中检索Autofac IContainer

时间:2016-02-26 12:47:45

标签: autofac nservicebus

我想知道是否有办法在注册后的任何时候检索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注册的容器,但我无法弄清楚如何执行此操作。有没有办法检索它?

2 个答案:

答案 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>();

(完全未经测试的示例代码。)