2013-10-18 57 views
4

我使用DI編寫了一個大型應用程序。應用程序由初始化時的引導程序組成,其中大多數依賴項都被注入。一切皆好。使用依賴注入替換使用ServiceLocator的單身人士

但是,有一些服務*,我不能簡單地注入到處。一個很好的例子是日誌服務。這是一個日誌,因此,解決方案中的每一個類都可能希望將其用於調試或跟蹤目的。並不是每個類都是在初始化時創建的,有些是由第三方提供的(應用程序有點像框架)。現在,我的解決方案是使用單例;我甚至爲singleton創建了一些包裝類,所以我可以在可能的情況下注入它。

我在想,如果更好的方法是在這些地方使用ServiceLocator。這將完成刪除單身人士造成的硬連接。類會與定位器耦合,是的,但我可以爲它們提供任何實現。

* 在DDD術語中。

P.S .:我在這裏使用.NET,但我不會標記它;我相信這個問題適用於接受DI的任何語言。

+5

這兩個選項都不好。日誌記錄是一個交叉問題,所以最好作爲裝飾處理:http://stackoverflow.com/a/7906547/126014 –

回答

0

在Java EE 6/7環境中,交叉方面的最佳選擇是使用攔截器。交叉切割功能可以輕鬆分解爲可重複使用的攔截器。我不知道.NET中是否有類似的東西。

另一方面,設計模式Service Locator在某種程度上被CDI替換爲。該模式與服務實現的細節中的應用程序代碼隔離。 CDI可以提供與服務細節相同的隔離級別,但更容易。

如果您需要在應用程序的生命週期中維護Bean的狀態,則應使用@Singleton

以上內容適用於Java EE 6/7環境。

+0

保羅,你可以通過CDI向我發送一些信息嗎?我對這個縮寫詞不熟悉。 –

+0

在Java EE平臺和[.NET依賴注入容器的_List中的[_23.2 CDI_]概述(http://docs.oracle.com/javaee/7/tutorial/doc/cdi-basic002.htm) (IOC)_(http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx)。 –

+0

什麼是「CDI」?它更可取的是在引入縮寫時描述其縮寫。 – enorl76

0

添加到Paul Vargas ...與攔截器類似的概念是面向方面編程(AOP),這可能是您想要查看的內容。

我不確定你正在使用哪個DI框架。如果您使用的是Spring .NET,則該功能絕對可用。例如,在輸入和退出每個方法調用時,添加調試級或跟蹤級日誌記錄會很有用。

http://www.springframework.net/doc/reference/html/aop-quickstart.html

+0

我實際上使用Unity(EntLib);儘管Mark評論和大多數答案都是正確的,但問題在於我沒有注入的代碼。我將不得不在這裏燃燒更多的大腦。但是,謝謝你的回答,真的。 –