2012-03-01 87 views
1

我有一個用作數據模型的類。我將簡化它是這樣的:混合封裝和依賴注入

public class DataModel 
{ 
    public bool IsDataModelActive {get; internal set;} 
} 

那麼,誰將會用我的DLL的程序員將只能看到他們需要的東西,而不用擔心打破任何東西。

另一方面,我想在我的課程中使用DI,使用DataModel。所以,我必須創建一個接口:

public interface IDataModel 
{ 
    bool IsDataModelActive {get;} 
} 

所以我注入這在我的課:

public class Class1 
{ 
    IDataModel dataModel; 

    public Class1(IDataModel dataModel) 
    { 
     this.dataModel = dataModel 
    } 
} 

在這種情況下,這是不可能的,我訪問dataModel.IsDataModelActive的制定者。

我發現最好的補丁是接受注射後投:

public class Class1 
{ 
    DataModel dataModel; 

    public Class1(IDataModel dataModel) 
    { 
     this.dataModel = (DataModel)dataModel 
    } 
} 

這有助於爲單元測試,但它那種打破DI的整個概念。如果我有另一個實施IDataModel的課程,該怎麼辦?

你/你會用什麼策略?

回答

3

如果接口IDataModel不允許你從DataModel之外訪問setter,那麼(希望不奇怪)你不應該需要從DataModel之外訪問setter。 DataModel本身或者可以看到setter的東西都應該負責設置該值。

+0

這將使sens。所以我必須選擇將我的製片人展示給世界,而不是使用DI。那真不幸! – Mathieu 2012-03-01 16:54:30

+0

或者這可能只是我身邊的糟糕設計? – Mathieu 2012-03-01 16:59:15

+0

只是不好的設計可能(沒有進攻)。什麼定義了「IsDataModelActive」應該是真還是假? – 2012-03-01 17:02:48

2

Class1是公開可見的 - 即暴露給消費者嗎?如果不是,則創建另一個內部接口IDataModelInt:IDataModel並在那裏提供setter。使用第二個爲你的內部工作。

+0

這似乎是最好的主意。它迫使我發送兩次相同的對象(依賴)作爲兩個參數,但這是一個體面的解決方案。 – Mathieu 2012-03-01 17:02:49