2013-12-17 43 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

相關問題