2017-02-24 9 views
0

構造のようなツリー内に互いに入れ子にすることができる一連の条件付き要件がありますが、すべての要件が異なるサブシステムと通信して、達成される。たとえば、特定のインベントリアイテムが存在するかどうか、あるオブジェクトが特定の属性をチェックするかどうか、イベントシステムが特定のイベントが発生したかどうかを確認するなど、ある要件がチェックされる可能性があります。ツリー全体を階層全体として扱うだけでなく、各ノードが必要とするサブシステムと通信できるようにします。複合オブジェクトノードとその依存関係の疎結合

答えて

0

アグリゲーションをモデル化し、後で依存性注入(What is dependency injection?を参照)を使用して、目的の機能を満たす必要があるオブジェクトを要求する必要があるようです。

各ノードはdomain modelのようになります。

このような何か:

明らか
public class A 
{ 
    // You inject some service IServiceX 
    public A(IServiceX serviceX) 
    { 
     ServiceX = serviceX; 
    } 

    private IServiceX ServiceX { get; } 

    // B is associated to A 
    public B B { get; set; } 

    // So you can do some stuff calling the whole ServiceX 
    public void DoStuff() 
    { 
     ServiceX.DoWhatever(); 
    } 
} 

public class B 
{ 
    public B(IServiceY serviceY) 
    { 
     ServiceY = serviceY; 
    } 

    private IServiceY ServiceY { get; } 

    // C is associated to B 
    public C C { get; set; } 

    public void DoStuff() 
    { 
     ServiceY.DoWhatever(); 
    } 
} 

public class C 
{  
    public C(IServiceZ serviceZ) 
    { 
     IServiceZ = serviceZ; 
    } 

    private IServiceZ IServiceZ { get; } 

    public void DoStuff() 
    { 
     IServiceZ.DoWhatever(); 
    } 
} 

、あなたはこれらの凝集体の一部にサービス以上のものを注入できます。各集約は他の集約に関連付けられているので、ツリーを横断できなければなりません。

+0

私は、ツリー内のノードではなくノードにサブシステムを連結することを意味しました。私は依存性注入が有望だと思う。依存性注入は、既にインスタンス化されているオブジェクトを注入することを可能にするか、または各コンストラクタまたはプロパティに対して新しいインスタンスを注入するか? – Adam1980

+0

@ Adam1980既存のインスタンスを挿入できます。 Caslte Windsorはそれを行うことができますが、他の人がこの能力を所有しているかどうかはわかりません。たとえば、 'container.Register(Component.Filter)。()。インスタンス(インスタンス))' –

+0

@ Adam1980おそらくあなたはインスタンスを自分で作成したくないかもしれませんが、キャッスルウィンザーのようなバインディングライフスタイルは既に提供しています。 https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md#bound-to-nearestを参照してください。 –

関連する問題