我有a
个A
和b
个实例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
。但它会感觉不对。
注意:我还没有看到这个问题的答案,因为双向沟通成为可能。
答案 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;