我在同一个类库中有以下类和实现
public interface IA
{
}
public class A : IA
{
private IB _ib;
public A(IB ib)
{
_ib = ib;
}
}
public interface IB
{
}
public class B : IB
{
private IA _ia;
public B(IA ia)
{
ia = _ia;
}
}
我的问题是IA或IB何时实例化,执行依赖注入时会创建任何循环依赖吗?如果是这样,如何解决?
答案 0 :(得分:1)
简短的回答是,是的,这将是一个问题。
有解决方案,这些解决方案取决于所使用的DI容器/解决方案。
即使您解决了该问题,也强烈表明您的设计并不理想,应该进行修改。
在大多数情况下,您应该能够轻松提取A和B所依赖的第三个接口。
答案 1 :(得分:1)
您的代码将具有循环依赖关系,并将在运行时引发异常。您需要重构代码,以使A
和B
彼此之间没有依赖关系。您将需要从A或B中提取一个新接口(IC
)并将代码重构为如下所示:
public interface IA {
}
public class A : IA {
IC _c;
public A(IC c) {
_c = c;
}
}
public interface IB {
}
public class B : IB {
IA _a;
IC _c;
public B(IA a, IC c) {
_a = a;
_c = c;
}
}
public interface IC {
}
public class C : IC {
}
有关如何重构类以删除循环引用的信息,请参见Circular Dependency in constructors and Dependency Injection