2013-07-17 73 views
2

我想更好地瞭解IoC容器是如何工作的,併爲自己編寫一些代碼。爲容器創建類時是否有最佳做法?是單身嗎?它是靜態的嗎?它不是一個單身人士,但只是有一堆靜態屬性來保存解析對象?是IoC容器單身還是靜態?

回答

1

我知道的IoC容器既不是靜態的,也不是單身的,我看不出有什麼好的理由讓它們成爲現實。只要將它製作成一個普通的類並創建它的實例即可。有些情況下您可能想要使用多個實例來分離獨立的問題。

正如你想保持你的組件不知道容器,即不要讓它們引用容器。如果您的組件(容器正在解析的對象)需要能夠訪問容器以獲取新實例,則通常會爲此抽象接口(通常稱爲Service Locator Pattern(.NET,但它們都是相同的)),並讓容器注入到組件中。同樣,靜態類或方法沒有理由。

遵循這種做法的一個很好的理由是,您可以交換容器實現,例如切換到「專業」IoC框架,而無需觸摸組件。

除此之外,通常對靜態類和方法有一些限制,通常不需要,特別是當系統可能發生變化,增長和變得複雜時。提到兩點:靜態類不能實現接口。因此,您絕對不能爲了測試而嘲笑您的容器;容器的每次使用都需要對容器組件的固定引用,而不是對合同的引用。你不能繼承一個靜態類;

+0

許多IoC容器允許您將一個類標記爲單例。無論何時向容器請求該類的對象,它都會查看該對象是否已在之前創建並將已創建的對象返回。您如何在多個類中實現這一目標,而無需將IoC對象傳遞給每個創建的對象? – David

+0

單例服務的實例只在一個容器實例的範圍內共享。使用多個容器只有在每個容器都有自己的工作域時纔有意義,而沒有任何相互依賴性。在一個正常的應用程序中,您將在啓動順序中創建一個容器,大多數情況下在啓動後立即啓動,然後使用此實例解決所有問題。 – Marc

+0

啊我明白了。我正在爲Android開發。我想這就是爲什麼已經有DI框架的原因,因爲Android爲你創建了一些你無法控制的對象。 – David