使用参数解决依赖关系

时间:2017-01-26 10:46:25

标签: c# wpf dependency-injection ninject

我们说我有以下课程:

class A
{
    // reference to B
    private B _b;

    // constructor for A
    public A(B b)
    {
        _b = b;
    }
}

class B
{
    private A _a;

    // constructor for B
    public B()
    {
        // initialize A and give it a reference on self
        a = new A(this);
    }
}

如何使用依赖注入替换A的手动初始化,考虑A实现相应的接口IA,并且我的ninject配置中有相应的绑定:

.Bind<IA>().To<A>().InTransientScope();

欢迎任何解决方法:) 附:这是一个WPF应用程序。

1 个答案:

答案 0 :(得分:2)

您需要将代码重构为

class A {
  private B _b;
  public A(B b) {
    _b = b;
  }
}
class B {
  private A _a;
  public B(A a) {
    _a = a;
  }
}

但是,这会创建一个循环引用,您的容器可能会抛出异常。

要解决此问题,您需要将代码重构为

class A {
  private C _c;
  public A(C c) {
    _c = c;
  }
}
class B {
  private A _a;
  private C _c;
  public B(A a, C c) {
    _a = a;
    _c = c;
  }
}
class C {
  public C() {
  }
}

请参阅Circular Dependency in constructors and Dependency Injection,了解如何将类重构为C