在同一个 class 库中对注入的循环依赖
Circular dependency on injection within same class library
我在同一个 class 库中有以下 classes 和实现
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 何时被实例化,在执行依赖注入时是否会创建任何循环依赖?如果是,如何解决?
简短的回答是,是的,这将是一个问题。
有解决方案,这些解决方案取决于所使用的 DI container/solution。
即使你解决了这个问题,也强烈表明你的设计不理想,应该修改。
在大多数情况下,您应该能够轻松提取 A 和 B 所依赖的第三个接口。
您的代码将具有循环依赖性,并会在运行时抛出异常。您需要重构代码,使 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 了解如何重构您的 类 以删除循环引用
我在同一个 class 库中有以下 classes 和实现
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 何时被实例化,在执行依赖注入时是否会创建任何循环依赖?如果是,如何解决?
简短的回答是,是的,这将是一个问题。
有解决方案,这些解决方案取决于所使用的 DI container/solution。
即使你解决了这个问题,也强烈表明你的设计不理想,应该修改。
在大多数情况下,您应该能够轻松提取 A 和 B 所依赖的第三个接口。
您的代码将具有循环依赖性,并会在运行时抛出异常。您需要重构代码,使 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 了解如何重构您的 类 以删除循环引用