亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

依賴注入和服務定位器模式之間有什么區別?

依賴注入和服務定位器模式之間有什么區別?

精慕HU 2019-08-14 17:21:20
依賴注入和服務定位器模式之間有什么區別?這兩種模式看起來都像是控制反轉原理的實現。也就是說,一個對象不應該知道如何構造它的依賴關系。依賴注入(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示例更容易進行單元測試 - 因為您可以將其依賴對象的模擬實現傳遞給它。如果需要,您可以將兩者結合起來 - 并注入服務定位器(或工廠)。


查看完整回答
反對 回復 2019-08-14
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

服務定位器隱藏依賴關系 - 當從對象獲取連接時,您無法通過查看對象是否訪問數據庫(例如)。使用依賴項注入(至少構造函數注入),依賴項是顯式的。

此外,服務定位器打破了封裝,因為它們提供了對其他對象的依賴關系的全局訪問點。使用服務定位器,與任何單例一樣

很難為客戶端對象的接口指定前置和后置條件,因為其實現的工作可以從外部進行干預。

使用依賴項注入,一旦指定了對象的依賴項,它們就會受到對象本身的控制。


查看完整回答
反對 回復 2019-08-14
  • 3 回答
  • 0 關注
  • 1143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號