我遇到了像Ninject,Unity或其他任何類型的IoC(DI)容器的優點。我理解如下概念:DI容器的好處和正確用法
DI:將依賴關係注入需要它的類(最好通過構造函數注入)。我完全明白爲什麼不太緊密的耦合是一件好事。
public MyClass{ ISomeService svc; public MyClass(ISomeService svc){ svc = svc; } public doSomething(){ svc.doSomething(); } }
服務定位器:當一個「容器」被直接使用,需要一個扶養類內部,解決了扶養。我確實得到了這樣的觀點,即產生了另一個依賴關係,我也看到基本沒有任何東西被注入。現在
public MyClass{ public MyClass(){} public doSomething(){ ServiceLocator.resolve<ISomeService>().doSomething(); } }
,什麼混淆我是一個 「DI容器」 的概念。對我來說,它看起來就像一個服務定位器,根據我的理解,它只應用於應用程序的入口點/啓動方法,以註冊並解決依賴關係,並將它們注入其他類的構造函數中 - 而不是這需要扶養(可能是爲什麼服務定位器被認爲是「壞」同樣的道理)
什麼是使用容器時,我可以創建扶養,並把它傳遞到目的的具體類中構造函數?
public void main(){ DIContainer.register<ISomeService>(new SomeService()); // ... var myclass = new MyClass(DIContainer.resolve<ISomeService>()); myclass.doSomething(); }
是否真的有意義通過所有的依賴關係的所有類的應用程序初始化方法?可能有100個最終需要(或不需要)的依賴關係,並且僅僅因爲它被認爲是您在init方法中創建它們的良好實踐?
這是一篇關於使用容器的優點和缺點的優秀文章:http://blog.ploeh.dk/2012/11/06/WhentouseaDIContainer/ – jrahhali