如何在消息处理程序中处理NServiceBus子容器?

时间:2013-12-17 23:18:59

标签: nservicebus structuremap pluggable

我正在使用 NServiceBus 4.0.3, StructureMap 2.6.4.0和 NHibernate的

我已经按如下方式配置了我的端点:

public class EndpointConfig : IConfigureThisEndpoint, 
    AsA_Client, IWantCustomInitialization
{
    public void Init()
    {
        Configure.With(
            .StructureMapBuilder(getContainer());

        Configure.Features.Disable<SecondLevelRetries>();
        Configure.Features.Disable<Sagas>();
        Configure.Features.Disable<TimeoutManager>();
    }
}

private IContainer getContainer()
{
    var container = new Container(x =>
    {

        x.Scan(s =>
        {
            s.WithDefaultConventions();
            s.TheCallingAssembly();
      });

        x.ForSingletonOf<ISessionFactory>().Use(createSessionFactory());
        x.For<ISession>().Use(context => 
            context.GetInstance<ISessionFactory>().OpenSession());
    });

    return container;
}

我有一个pluginfamily,我想在运行时获取对象的实例(不能使用构造函数注入)。

在StructureMap世界中,可以使用:

来完成

ObjectFactory.GetNamedInstance<ISomething>("familyName");

但是当我使用NServiceBus和structuremap时,它会为每条消息获取一个嵌套容器。
当我想获取一个对象的实例时,上面的代码只会给我一个来自父容器的实例。由于ObjectFactory从未初始化,因此它不会获得实例。

如果我用我的容器初始化ObjectFactory,因为它是一个静态包装器,每个消息使用它是不安全的。

那么如何处理给定消息的子容器以便我可以使用插件系列?

1 个答案:

答案 0 :(得分:1)

您无法通过NServiceBus IBuilder api(https://github.com/Particular/NServiceBus/issues/1565

访问该孩子

但我很确定你可以通过将StructureMap提供的原生IContainer接口注入你的处理程序来实现它。

简而言之:

依赖StructureMap.IContainer