2011-04-25 95 views
15

我使用Autofac與ASP.NET MVC集成,我的所有控制器都接收到依賴關係,Autofac自動解析嵌套依賴關係。太棒了它的工作原理全局訪問ASP.NET MVC3中的autofac依賴解析器?

但是我如何解決控制器實例化範圍之外的依賴?在我的代碼深處的一些地方,我需要問我的記錄器解析器。一方面,將Logger作爲依賴關係傳遞給我創建的每個小對象似乎都是錯誤的,另一方面它似乎錯誤地依賴於依賴解析器在我的代碼中如此之深:

例如,我有一個名爲Result的類從許多操作中返回。這是一個一致的使用對象,我的應用程序代碼可以依靠從更深層返回。當更深層次的代碼向這個對象添加一個UI錯誤時,我想自動將它添加到記錄器,這需要解決。讓每類取記錄器的依賴只會得到

任何幫助表示讚賞感謝

回答

7

的方式那麼,如果在每個對象的依賴激怒你,但我不事沒有,你可以使用事件觸發(發佈/訂閱方法)依賴中央Logger解析器出現任何問題。 如果您真的需要從每個類中記錄日誌,那麼您可以將日誌記錄視爲應用程序的核心部分,並且您可以像其他常見的類型(如字符串或Ints)一樣輕鬆地進行處理,這些類型無處不在,並且安全可靠。 但我會建議你別的。恕我直言,你應該rething的架構,並不登錄每一堂課。如果你的日誌記錄只是(或者主要)寫錯誤(例外),那麼不要用它監視你的域模型。讓它放置在服務層insteád中。這種編排圖層可以正確評估每個捕獲的異常,並只記錄需要處理的異常。讓我們將這些異常提交到堆棧跟蹤中較低的可能位置,並將它們作爲最後一件事處理。

+2

你說得對。這似乎是一個很自然的地方,但我只是增加了額外的職責。現在我將ui錯誤添加到BaseController.OnActionExecuted()中的ActivityLog中。首先來自ModelState字典。其次,我現在在BaseController中有一個Result對象,當所有操作調用domain/repo方法時,都使用它。在OnActionExecuted()中,我將這些錯誤添加到我的ActivityLog中。所以這一切仍然是集中的,但事情正處於適當的位置。感謝您將我從一個不好的解決方案中轉移出來這樣做好得多,並且可以保持可測試的狀態 – 2011-04-25 15:03:44

+0

僅僅爲了增加這一點,我已經解決了一個解決方案 - 我的服務層返回一個Result對象,它封裝了所有異常,並且已經將用戶輸入異常降級爲僅僅是錯誤消息顯示在ui上。 Result對象位於我的所有控制器的基本控制器中,而basecontroller的OnActionExecuted檢查Result.Exceptions,這是我登錄異常的唯一地方,它只是一個簡單的循環和一個用於記錄每個異常的內存。控制器本身發生的異常由基礎控制器的OnException處理 – 2011-10-11 10:27:45

35

你正在尋找的東西是MVC的DependencyResolver.Current

var logger = DependencyResolver.Current.GetService<ILogger>(); 
0

人們尋找另一個解決這個問題可能有一個看的是需要IComponentContext解析服務的優勢直接Autofac注入這個其他SO answer

3

使用DependencyResolver.Current絕對是一種解決ASP .NET MVC中的問題的方法,因爲它是一個框架功能。不過,我會首先嚐試按照從"Best Practices" section of the Autofac Wiki

給予組件進入容器中的以下建議,將其存儲在一個公共靜態屬性,或使功能,如解析()可在全球」國際奧委會類這些設計與服務定位器模式有很多共同之處 如果組件對容器有依賴關係,請看他們如何使用容器來檢索服務,並將這些服務添加到組件的(依賴注入)構造函數參數 使用關係類型來實現組件的實例化,或者使用更高級的方式與容器交互

只有在無法重新建立上述依賴關係的情況下,纔可以使用DependencyResolver。

+0

Autofac最佳實踐文檔現在位於http://autofac.readthedocs.io/en/latest/best-practices/index.html – 2016-07-25 15:33:35