Ninject:解决二级内部依赖

时间:2017-08-23 19:32:56

标签: wpf mvvm dependency-injection ninject

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

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

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

    public A()
    {
    }
}

通过默认构造函数实例化A的B类:

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


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

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

2 个答案:

答案 0 :(得分:1)

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

我相信这更多是关于如何正确实现MVVM。参见像Caliburn micro或Prism这样的框架。

答案 1 :(得分:1)

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

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

public class B
{
    public A MyA;

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

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

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

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

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