2

我正在使用 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;
}

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

在 StructureMap 世界中,可以使用以下方法完成:

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

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

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

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

4

1 回答 1

1

您无法通过 NServiceBus IBuilder api ( https://github.com/Particular/NServiceBus/issues/1565 )访问孩子

但是我很确定您可以通过将 StructureMap 提供的本机 IContainer 接口注入到您的处理程序中来实现它。

简而言之:

依赖 StructureMap.IContainer

于 2013-12-18T08:41:33.210 回答