依賴注入和服務定位器模式之間有什么區別?這兩種模式看起來都像是控制反轉原理的實現。也就是說,一個對象不應該知道如何構造它的依賴關系。依賴注入(DI)似乎使用構造函數或setter來“注入”它的依賴項。使用構造函數注入的示例://Foo Needs an IBarpublic class Foo{
private IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
//...}服務定位器似乎使用了一個“容器”,它連接了它的依賴關系并給它foo吧。使用服務定位器的示例://Foo Needs an IBarpublic class Foo{
private IBar bar;
public Foo()
{
this.bar = Container.Get<IBar>();
}
//...}因為我們的依賴項只是對象本身,所以這些依賴項具有依賴項,它們具有更多依賴項,依此類推。因此,控制容器的反轉(或DI容器)誕生了。示例:Castle Windsor,Ninject,Structure Map,Spring等)但是,IOC / DI容器看起來完全相同像一個服務定位器。將它稱為DI容器是一個壞名字?IOC / DI容器只是另一種服務定位器嗎?當我們有很多依賴關系時,我們使用DI容器這一事實的細微差別是什么?
3 回答

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
差異可能看起來很小,但即使使用ServiceLocator,該類仍然負責創建其依賴項。它只是使用服務定位器來完成它。使用DI,該類被賦予其依賴性。它既不知道,也不關心它們來自何處。這樣做的一個重要結果是DI示例更容易進行單元測試 - 因為您可以將其依賴對象的模擬實現傳遞給它。如果需要,您可以將兩者結合起來 - 并注入服務定位器(或工廠)。
- 3 回答
- 0 關注
- 1143 瀏覽
添加回答
舉報
0/150
提交
取消