循环依赖同一类库中的注入

时间:2018-07-19 01:10:10

标签: c# dependency-injection circular-dependency

我在同一个类库中有以下类和实现

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何时实例化,执行依赖注入时会创建任何循环依赖吗?如果是这样,如何解决?

2 个答案:

答案 0 :(得分:1)

简短的回答是,是的,这将是一个问题。

有解决方案,这些解决方案取决于所使用的DI容器/解决方案。

即使您解决了该问题,也强烈表明您的设计并不理想,应该进行修改。

在大多数情况下,您应该能够轻松提取A和B所依赖的第三个接口。

答案 1 :(得分:1)

您的代码将具有循环依赖关系,并将在运行时引发异常。您需要重构代码,以使AB彼此之间没有依赖关系。您将需要从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