2013-12-17 42 views
2

我使用 NServiceBus 4.0.3, StructureMap 2.6.4.0和 NHibernate的如何获取消息处理程序内的NServiceBus子容器的句柄?

我已经配置我的终点如下:

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,因为它是一个静态包装器,它不会安全地使用它的每个消息。

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

+0

依赖这可能不回答你的问题,但你能不能换也许在一些其他对象的检索,如'ISomethingProvider'的实现?该实现可以访问您需要的结构映射的基本实例,并且它包装服务定位器位。在消息处理程序中,您可以使用构造函数注入来获取提供程序。我不知道结构图,并没有使用其他工具的子容器,所以我希望我不会说太多的废话:) –

+0

我需要在运行时确定实例,所以我确实需要定位器服务,但该确定定位器服务是我想让它留给Structuremap插件家族的东西。 – user1414095

回答

1

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

访问孩子,但我敢肯定,你可以通过注入由StructureMap提供到您处理器原生的IContainer接口得到它。

简而言之:

就以StructureMap.IContainer

+0

这正是我一直在寻找的! –

+0

谢谢安德烈亚斯。这是我正在寻找的答案。 – user1414095

相关问题