2012-03-01 13 views
1

私はデータモデルとして機能するクラスを持っています。私はこれを次のように単純化します:カプセル化と依存性注入の混合

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

私のDLLを使用するプログラマは、何かを壊す危険性なしに必要なものだけを見るでしょう。

フリップサイドでは、DataModelを使用するクラスでDIを使用したいと思います。だから私は、インターフェイスを作成する必要があります。

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の外部からセッターにアクセスできない場合、驚くことではありません。はDataModelの外側からセッターにアクセスする必要がありません。 DataModel自体、またはセッターを見ることができるものは、その値を設定する責任があります。

+0

それは感覚を作るでしょう。だから私は自分のセッターを世界に公開するか、DIを使わないかを選択する必要があります。それは残念です! – Mathieu

+0

それとも私の側にはちょうど良いデザインですか? – Mathieu

+0

ちょうど悪いデザイン(たぶん違反しない)。 'IsDataModelActive'が真であるか偽であるべきかを定義するものは何ですか? –

2

Class1は一般に公開されていますか?つまり、消費者に公開されていますか?存在しない場合は、別の内部インタフェースIDataModelInt:IDataModelを作成し、そこでsetterを提供します。内部作業には2番目のものを使用してください。

+0

これは最善の考えです。それは2つのパラメータとして同じオブジェクト(依存関係)を2回送信するよう強制しますが、それはまともな解決策です。 – Mathieu