2012-07-12 61 views
1

我試圖讓自己熟悉MVC3autofac,但我遇到了我在遇到麻煩解決小問題。使用集裝箱/ DependencyResolver其他DLL

我正在使用autofacMVC3集成,並且都運行良好,頁面加載正確,依賴關係正在被注入,這很酷。什麼是竊聽我是如何利用autofacContainerMVCDependencyResover在類庫項目。
我正在嘗試創建靜態類,它將幫助我處理域事件。我只是希望能夠調用具有事件參數的方法,並且應該由這個類來處理所有事情。這裏是代碼:

public static IContainer Container { get; set; } 
public static void Raise<T>(T e) where T : IDomainEvent 
{ 
    foreach (var eventHandler in DomainEventManager.Container.Resolve<IEnumerable<EventHandlers.Handles<T>>>()) 
    { 
     eventHandler.Handle(e); 
    } 
} 

正如你可以看到它是非常簡單,一切都將工作的偉大,如果不是MVC方法。我的一些依賴是registeres爲InstancePerHttpRequestNHibernate「會議),而其他註冊爲InstancePerDependencySingleInstance。因此,當我嘗試使用在我的UI項目中創建的container時,我發現沒有httpRequest標籤可用。

如何重用在web項目中創建的Container以訪問其所有功能,包括InstancePerHttpRequesthttpRequest標記?

或者,也許還有其他的解決我的問題?我正在考慮使用委託函數來獲取事件處理程序,但我不能(我可以嗎?)創建通用委託,我不需要在賦值時使用具體類型進行初始化。

爲什麼我要用靜態類來做這個基本上每個entityaggregateservice都需要能夠引發域事件。將EventManager注入其中每一個都會很麻煩,靜態類正是解決我所有問題的方法。

如果有人可以幫助我讓我的周圍的頭,我將不勝感激。
乾杯,Pako

回答

0

你不應該直接從你的應用程序代碼引用你的容器。這看起來像Service Locator反模式。正確的操作是將您的對象傳遞給他們完成工作所需的服務,通常通過構造函數參數完成。但是...如果你要堅持取決於全球靜態的,那麼至少模型EventManager作爲一個單身,使得在使用看起來像:

EventManager.Current.Raise<SomeEvent>(someObject); 

,然後你可以設置EventManager.Current等於正確在您的應用程序初始化時構建實例。

+0

我同意你的看法,通常你不應該做這樣的事情,然而這,可以說,特殊情況。將這個類注入到我的域中的每個對象將會很麻煩。創建'singleton'與創建靜態類似乎沒有太大區別,我認爲它與獲取靜態類的事件處理函數時會有同樣的問題,它會拋出異常,導致'httpRequest'標記不存在。 – Pako 2012-07-13 08:58:48

+0

單例和靜態類的區別在於,單例允許你在自動化測試中用更可測試/可嘲諷的版本替換實例。 – 2012-07-13 12:56:58

+0

至於httpRequest標籤部分,如果您打算在非Web上下文中使用同一個確切的容器,則不要使用InstancePerHttpRequest註冊您的服務。我通常使用InstancePerLifetimeScope(),它的功能與IPHR相同,除非你明確地創建自己的Lifetimecopes。 – 2012-07-13 12:59:27