Wpf Ninject:解析第二级内部依赖关系

Wpf Ninject:解析第二级内部依赖关系,wpf,mvvm,dependency-injection,ninject,Wpf,Mvvm,Dependency Injection,Ninject,我要进入Ninject了。简化我的真实场景,我有一个带有属性注入的a类: public class NinjectBindings : NinjectModule { public override void Load() { Bind<IMasterViewModel>().To<IQMasterViewModel>(); } } public class A { [Inject] public IMasterV

我要进入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()
    {
    }
}
公共类NinjectBindings:NinjectModule
{
公共覆盖无效负载()
{
绑定()到();
}
}
公共A类
{
[注入]
公共IMasterViewModel\u viewModel
{
得到;
设置
}
公共A()
{
}
}
以及通过默认构造函数实例化的类B:

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


Ninject.IKernel kernel = new StandardKernel(new NinjectBindings());
var b = kernel.Get<B>();
公共B类
{
公共A=新A();
}
Ninject.IKernel kernel=新的标准内核(新的NinjectBindings());
var b=kernel.Get();
如果我尝试使用Ninject.kernell.Get()调用解析类B,则不会将类A的依赖项注入到实例中。 如果我不能改变对象A的实例化方式,有人能建议什么是处理这种注入的正确方法吗? 因为在实际场景中,类B是WPF窗口,而类a是在XAML中声明的UserControl。
谢谢。

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


我相信这更多的是关于如何正确地实现MVVM。请参阅Caliburn micro或Prism之类的框架如何操作。

为了注入依赖项,需要由Ninject实例化

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

public class B
{
    public A MyA;

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

请注意,您发布的绑定

Bind<IMasterViewModel>().To<IQMasterViewModel>();
Bind().To();
似乎是将接口绑定到接口而不是具体类型,这是错误的