2012-07-11 80 views
0

放置例如我可以訪問的靜態類中的autofac/ninject來自不同的程序集/項目?IoC:使用靜態IoC容器進行依賴注入

static class MyContainer static {} IoCContainer ContainerOfCurrentRuntimeContext; }

如果我使用這個,我可以在不同的項目中使用相同的IoC上下文。

+1

但是,如果你這樣做,這將意味着你的代碼的其他部分將調用它來獲取實例,這與控制手段的反轉是完全相反的。類不應該負責獲取它們的依賴關係。這些依賴關係應該作爲構造函數參數(構造函數注入)或屬性(屬性注入)傳遞。你的DI容器應該只在應用程序的一個地方可見,通常是最外層的地方。 – 2012-07-11 15:57:32

+0

@DarinDimitrov:不,它不是控制倒置的對立面。控制的倒置只是說我們應該與抽象對話,而不應該自己創建對象。然而,它與依賴注入相反。 – Steven 2012-07-11 17:32:55

+0

請在Stackoverflow和Google搜索「服務定位器反模式」。使用全局可訪問的容器稱爲「服務定位器模式」,它被認爲是反模式。 – Steven 2012-07-11 17:34:29

回答

3

沒有,這種做法將增加兩個新問題:服務定位模式(既算作反模式)。因此,您的代碼將與新的依賴關係耦合在一起:您的DI容器

通常你能夠克服使用服務定位器的限制,但是這不值得做,因爲它更簡單介紹組成根爲DI。

順便說一句,你可以有一個配置,並在你所有的不同項目中使用它。

+0

好的,謝謝。單配置點:但在這種情況下,我不會得到相同的實例,不是嗎? – user437899 2012-07-12 06:33:48

+0

是的,_one_依賴注入_kernel_(根據nIninject)可以多次解析相同的依賴對象。這是通過聲明特定的_scope_(根據nIninject)來完成的。您可以指定每次在線​​程或http請求的作用域中請求DI時,DI將逐字地注入相同的依賴實例。你也可以定義你自己的範圍。 – Akim 2012-07-12 15:42:53