Ninject: 解决二级内部依赖

Ninject: resolve second level inner dependency

我要进入 Ninject。简化我的真实场景,我有一个 class A 和 属性 注入:

public class NinjectBindings : NinjectModule
{
    public override void Load()
    {
        Bind<IMasterViewModel>().To<IQMasterViewModel>();
    }
}

public class A
{
    [Inject]
    public IMasterViewModel _viewModel
    {
        get;
        set;
    }

    public A()
    {
    }
}

还有一个 class B 通过默认构造函数实例化 A:

public class B
{
    public A a = new A();
}


Ninject.IKernel kernel = new StandardKernel(new NinjectBindings());
var b = kernel.Get<B>();

如果我尝试使用 Ninject.kernell.Get() 调用 class A 的依赖项来解析 class B,将不会注入到 A 实例中。 如果我不能改变实例化对象 A 的方式,谁能建议处理这种注入的正确方法是什么? 因为在实际场景中 class B 是 WPF Window 而 class A 是在 XAML 中声明的 UserControl。 谢谢

Class A 没有注入其依赖项,因为它是由您实例化的,而不是由您的容器实例化的。

我相信这更多的是关于如何正确实现 MVVM。查看 Caliburn micro 或 Prism 等框架如何操作。

为了让 A 注入其依赖项,它需要由 Ninject 实例化。

使用 IoC 时,您应该传递依赖关系,而不是在 class 和 new 中实例化。因此,您可以通过将 A 作为构造函数参数传递给 B 而不是在构造函数中自己实例化来解决此问题。

public class B
{
    public A MyA;

    public B(A a)
    {
        MyA = a;
    }
}

根据您的 classes 的设置方式,您可能需要创建绑定或让它们可自行绑定。我建议为 A 和 B 创建接口并将它们绑定到具体类型,因为它使代码更容易使用模拟框架进行测试。

请注意,您发布的绑定...

Bind<IMasterViewModel>().To<IQMasterViewModel>();

似乎是将接口绑定到接口而不是具体类型,这是错误的。