2016-05-11 11 views
1

は、その後すぐにいくつかのチェック場合aのメソッドを呼び出す必要がありますパス。私は、私はイベントを使用して、このarroundの取得とbaを知らない/独立したこと聞かせて可能性を知っている巡回DI依存性注入号(双方向通信)

public A(B b) { _b = b; } 
public void CallToB() { _b.Method(); } 
public void Method() { DoSomething(); } 

public B(A a) { _a = a; } 
public void Method() { if (SomeCheck()) _a.Method(); } 

を持つことになり、これを達成するために

。しかし、それは間違って感じるでしょう。

注:双方向通信が可能になったこの質問に対する回答はありませんでした。

+1

そして、それは循環依存を避けるのがベストですなぜこれがあるインタフェースが使用されている場合は、何がありました(..サイクルの外側に配線されているインプリメンテーション自体の間に確立されたサイクル) – user2864740

+0

循環依存性は設計上の欠陥を示すことがよくあります。これらのクラスを制御できれば、共通の依存関係'A'と' B'の両方が第3クラスに属しているので、 'A'と' B'の両方がお互い。 – topher

答えて

2

具体的な種類の代わりにインターフェイスに依存してこの問題を解決し、プロパティインジェクションを使用できます。次に例を示します。

public interface IA 
{ 
    void Method(); 
} 

public class A : IA 
{ 
    private readonly IB _b; 
    public A(IB b){_b = b;} 
    //... 
} 

public interface IB 
{ 
    void Method(); 
} 

public class B : IB 
{ 
    private readonly IA _a; 
    public B(IA a){_a = a;} 
    //... 
} 

public class BCycleDependencyBreaker : IB 
{ 
    private IB _b; 

    public IB b 
    { 
     set { _b = value; } 
    } 

    public void Method() 
    { 
     _b.Method(); 
    } 
} 

あなたは、このように構成するときは、その後、BCycleDependencyBreakerを使用しない:

var b_cycle_dependency_breaker = new BCycleDependencyBreaker(); 

//Make a depend on this implementation of b that currently does nothing 
A a = new A(b_cycle_dependency_breaker); 

//Make b depend on a 
B b = new B(a); 

//Now, let the proxy implementation delegate calls to the real b 
b_cycle_dependency_breaker.b = b;