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>();
似乎是将接口绑定到接口而不是具体类型,这是错误的。
我要进入 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>();
似乎是将接口绑定到接口而不是具体类型,这是错误的。