依赖注入问题(双向通信)

时间:2016-05-11 20:49:25

标签: dependency-injection

我有aAb个实例B

a必须能够在b上调用方法,b必须立即调用a上的方法,如果某些检查通过。

要实现这一点,我会有循环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(); }

我知道我可以使用事件来解决这个问题,让b不知道/独立于a。但它会感觉不对。

注意:我还没有看到这个问题的答案,因为双向沟通成为可能。

1 个答案:

答案 0 :(得分: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;