11

例子:當在基類中只需要依賴項時,在基類中使用Property注入是否合適?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

我們都知道,我們必須使用構造函數注入依賴性時,需要。如果它是可選依賴項,我們可以使用屬性注入來代替。

但是當只有你的基類需要依賴時你應該怎麼做?

當你使用構造函數注入你會在我看來污染所有的派生類。

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

是否approperiate使用物業注射在基類時基類只需要依賴?

回答

12

您不污染派生類。您明確地向消費者表明,如果沒有此依賴關係,此類不能運行。

如果基類需要此依賴性才能正常工作,因爲派生類是從此基類派生的,所以它也隱含地要求此依賴項。所以第二個例子是正確的方法。您不應該使用屬性注入來實現所需的依賴項。

+0

我明白了你的觀點,但是我得到的問題是很多構造函數參數。重點是派生類不直接與依賴關係進行對話,而不是基類。所以我會區分直接調用依賴和間接調用依賴。 – Rookian

+0

@Rookian,如果您遇到了具有多個構造函數參數的情況,您可能會考慮創建一個服務來聚合這些依賴項,然後僅將該服務注入構造函數。 –

+5

+1贊成組合繼承。如果它成爲一個帶有太多構造函數參數的問題,請責怪你的繼承策略,而不是構造器注入。 –

3

其實你的派生類是一個基類。某處沒有其他物體。當你傳遞一些東西給基礎構造函數時,你實際上會初始化同一個對象。它顯示給客戶什麼樣的情況下取決於:

有一個實例,這取決於兩個因素:用戶信息庫和工作單位。調用基類構造函數只是從派生類中刪除初始化重複。

相關問題