2011-12-22 4 views
3

次のクラス図は、私が取り組んでいるプロジェクトの簡略化されたバージョンです。依存関係をリダイレクトするためのデザインパターン

Class Diagram

クラスAは、私はクラスCをデシリアライズときに、フレームワークは、すべての新しいインスタンスを作成し、私は直列化のためのCSHARPのフレームワークを使用していますC.をルートオブジェクトのグラフをデシリアライズ/シリアライズする責任がありますCを起源とするオブジェクト(*新しいクラスによって図に示されています)。今、私はCのインスタンスをCnewに置き換えたいのですが、問題はB1とB2がまだ古いD1とD2を指しているということです。 B2とB2の依存関係を再初期化する必要はありません。

私は、B1とB2がAからD1とD2にアクセスできるようにする方法を探していますが、Cや互いにアクセスすることはできません。簡単にするために、私たちは、Aのメンバのすべてがpublicでなければならないと仮定することができます(これは、私が使用しているフレームワークから多くのメンバを公開するインタフェースを実装しています)。ここで

は、いくつかの潜在的な解決策Iのかかわらず、次のとおりです。

  1. だけ弾丸をかむとB1とB2に代わりD1およびD2のへの参照を与え、単に無視B1とB2

  2. を再初期化これにより、アクセスが不要な多くのクラスにアクセスできるようになります。

  3. Bクラスに直接アクセスする代わりに、Dクラスに直接アクセスすると、AのインスタンスD1およびD2を返す関数の代理人(関数ポインタ)にAパスが渡されます。

  4. HaveインスタンスはD1またはD2にインスタンスを返す1つの必須メソッドを持つD1ContainerおよびD2Containerのようなインターフェイスを実装します。その後、AをD1ContainerまたはD2Containerにキャストし、B1とB2に渡します。

このような種類のデザインパターンがありますか、私の解決策の1つは明らかに最高ですか?

ありがとうございます!

+0

Dependency InjectionまたはInversion of Controlのコンテナをチェックしましたか? –

答えて

1

あなたのデザインに間接の別のレベルを導入しようとしている。基本的に、代わりのD1への参照を格納しD2あなたが最新のD1D2を取得してみましょう何かを保存しようとしています。遅延評価を実装するために新しいクラスを導入する必要がないので、#3(デリゲート)オプションは私にとって最もエレガントです。 ABに渡されるFunc<D>が必要です。新しいクラス、インターフェイス、または代理人はありません。すべてうまくカプセル化されたままです。 AはそのC、またはCはそのDを変更する変更した場合

class A { 
    private B myB; 
    private C myC; 
    public A() { 
     myC = new C(); 
     myB = new B(() => myC.MyD); 
    } 
} 
class B { 
    private readonly Func<D> getD; 
    public B(Func<D> getD) {this.getD = getD;} 
    public D { get { return getD(); } } 
} 
class C { 
    public D MyD {get; private set;} 
} 

は今、B.Dは自動的に正しいDを返し続けるだろう。これは、フードの下でBAへの参照を保持しているためですが、それが行われているかどうかはわかりません。

0
  1. 2.私が要件であると読んだ部分を無視します。BはAの定義へのアクセスを持っており、ちょうどそれをC

  2. が最も有望な選択肢であるへのアクセスを与えて、背中をキャストすることができるかどう

  3. が問題です。 Bが聞いているイベントを公開することで実装します。

関連する問題