2010-05-27 85 views
4

在我的域中,我擁有少量的「處理器」類,它們擁有大量的業務邏輯。使用默認約定的StructureMap,我將注入庫注入這些類的各種IO(數據庫,文件系統等)。例如:StructureMap - 將依賴注入到基類中?

public interface IHelloWorldProcessor 
{ 
    string HelloWorld(); 
} 
public class HelloWorldProcessor : IHelloWorldProcessor 
{ 
    private IDBRepository _dbRepository; 
    public HelloWorldProcessor(IDBRepository dbRepository) 
    { 
     _dbRepository = dbrepository; 
    } 
    public string HelloWorld(){ return _dbRepository.GetHelloWorld(); } 
} 

現在,有一些庫,我想提供給所有的處理器,所以我做了一個基類是這樣的:

public class BaseProcessor 
{ 
    protected ICommonRepository _commonRepository; 
    public BaseProcessor(ICommonRepository commonRepository) 
    { 
     _commonRepository = commonRepository; 
    } 
} 

但是,當我的其他處理器繼承從它,我得到一個編譯器錯誤每一個說,沒有構造函數的BaseProcessor,它採用零參數。

有沒有辦法做我想在這裏做的事情?也就是說,爲了讓其他類可以使用的基類中注入通用的依賴關係,而不必將注入寫入每個類中?

回答

4

不是。這是C#語言要求,而不是StructureMap限制。派生類必須將值傳遞給其基礎構造函數。如果您僅僅使用基類來處理注入一個通用服務,那麼您沒有獲得任何東西。只需在每個需要它的課程上安裝通用服務 - 您的IoC工具將會處理它 - 這會帶來什麼危害?

+0

我想這並沒有真正的危害,我只是想整理一些東西。使代碼更清潔一點。 現在的折衷是在每個類的構造函數中包含公共依賴項,或者手動實例化基類中的依賴項(調用ObjectFactory.GetInstance()而不是期待構造函數參數)。我想現在是抽出我的IoC容器的時候了,讓第二個選項更舒服一點:) – David 2010-05-27 20:00:18

+2

Nooooo ...那將會是一條糟糕的道路。僅僅因爲您對構造函數參數數量感到不舒服而強制使用服務位置?請不要。如果你有一些常見的依賴關係(不只是一個),那麼你可能有一些應該被分解到另一個服務中的通用功能。該服務將採用多個依賴項並執行需要它們的工作。然後您將該服務注入到其他構造函數中。這就是「支持構成而不是繼承」的含義。 – 2010-05-28 12:57:01

2

你想要的是屬性注入。基類可以擁有一個注入了依賴的公共屬性,因爲你永遠不會使用派生類作爲基類的具體實例 - 你將(應該)總是使用派生類的接口。

這裏的答案是爲了避免構造函數注入這個明顯的弱點,並在你的基類中使用屬​​性注入。

+0

我會同意你,如果他有一個共同的基類建模的原因。但是他正在創建一個「人造」基礎類,只是爲了吸收依賴。沒有好的結果,不管是否注資。 – 2011-10-05 02:45:27