2015-05-07 215 views
0
  1. 當使用依賴注入當一個類用戶在構造函數需要一個對象的一個​​新實例和什麼時候不需要時如何理解?

例如,類Car需要一個實現IEngine接口的類的新實例。注入新對象VS使用依賴注入時注入現有對象?

public class Car 
    public sub new(Engine as IEngine) 
    end sub 
end class 

同時,類Messager不需要實現​​接口的類的新實例。

public class Messager 
    public sub new(Logger as ILogger) 
    end sub 
end class 
  • 如何開發者或用戶最小化誤用的危險?
  • 回答

    1

    當使用依賴注入如何做時 構造函數需要一個對象的新實例,當不是一類用戶理解?

    如果類要求其依賴的一個新實例,你打破了Dependency Inversion Principle,因爲你正在泄漏的實施細則進入消費類。這個班不應該知道,也不應該關心這個。

    在運行時,您可能會構建一個無法重用的特殊引擎類型,但要知道這一點取決於Composition Root;消費者不應該在意。

    也許你遇到的問題是由運行時數據注入到服務中引起的。通過依賴注入,您可以構建組件的對象圖(具有行爲的類),並通過方法調用將對象圖中的數據對象(如消息,DTO,實體等)傳遞給對象圖。任何時候,通過將狀態(即運行時數據)注入到組件的構造函數中來破壞這個規則,你會發現自己陷入困境。

    然而,一個常見的錯誤來源是一個叫Captive Dependencies的問題。捕獲依賴項是一種依賴項,配置爲具有比其使用類型更短的生命週期。例如,您的Car可能會被註冊爲單身人士,而IEngine是暫時的。在這種情況下,Car將使IEngine長時間存活。

    有幾種方法可以防止這種情況發生。例如,當手動構建對象圖時,您經常會發現這些錯誤很容易彈出;但不幸的是並不總是。

    如果您使用DI庫,某些庫(簡單注入器和Castle Windsor)包含診斷工具,這些工具會警告您這種錯誤。

    防止這種情況的另一個好方法是防止組件保持任何狀態。這允許你使這個完整的對象圖由單例組成,並且這將防止首先陷入這個問題。這並不意味着你不能擁有生活方式較短的對象(例如工作單元),但只需要防止這些對象被注入對象圖中組件的構造函數。

    +0

    你是對的!我是在構造函數中注入數據對象!從來沒有想過這是錯的。 – Lightman