2016-02-26 96 views
0

我想知道是否有辦法在註冊後隨時檢索autofac容器。我註冊模塊如下(使用NSB 5.0):當我的端點開始我註冊監聽器(實施IWantToRunWhenBusStartsAndStops),其從一個WebSphereMQ檢索消息在NServiceBus中檢索Autofac IContainer

var builder = new ContainerBuilder(); 
builder.RegisterModule(new AutofacConfigModule()); 
container = builder.Build(); 
busConfiguration.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(container)); 

。爲了處理這些消息,我定義了一個接口(類似於NServiceBus IHandleMessages <>),然後我想解析並將反序列化消息傳遞給進一步處理。爲了解決我的自定義接口實現,我想使用我已經註冊的容器NServiceBus,但我不知道如何做到這一點。有沒有辦法檢索它?

回答

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解決。

這有幫助嗎?

+0

我結束了一些類似於你的建議(註冊一個組件並注入容器作爲屬性),儘管我認爲你的解決方案更好。謝謝您的幫助! – 5earch

0

是否可以使用ContainerDefinition註冊您自己的Autofac中間件實現?

​​

你可以註冊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>(); 

(沒有經過充分測試的代碼示例)