【问题标题】:Ninject: resolve second level inner dependencyNinject:解决二级内部依赖
【发布时间】:2017-08-23 19:32:56
【问题描述】:

我正在进入 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。 谢谢。

【问题讨论】:

    标签: wpf mvvm dependency-injection ninject


    【解决方案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>();
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-09
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        • 2015-10-16
        • 1970-01-01
        • 2014-10-10
        相关资源
        最近更新 更多