Ninject不会解析WPF中的构造函数注入

时间:2017-07-24 13:48:59

标签: c# wpf dependency-injection ninject

我的WPF桌面应用程序正在尝试使用Ninject注入一些接口依赖项,如下所示。应用启动看起来像这样,(我认为)自动生成:

<ng-view></ng-view>

然后我有一个void App_Startup(object sender, StartupEventArgs e) { IKernel _Kernel = new StandardKernel(); _Kernel.Load(Assembly.GetExecutingAssembly()); } - 扩展类,其Load方法被上面调用,绑定发生如下:

NinjectModel

我的观看模型接着Bind<Inheritance.IWindowProvider>().To<WindowProvider>().InSingletonScope(); ,在这种情况下,我还添加了IWindowProvider属性。

[Inject]

其他地方然后(在另一个虚拟机中),我想创建一个这个视图模型的实例:

[Inject]
public LoginDetailsVM (IWindowProvider windowProvider) {
    this.WindowProvider = windowProvider;
}

但是我遇到了“可怕的”错误:

  

激活IWindowProvider

时出错      

没有匹配的绑定可用,   而且这种类型不能自我约束。

我最初的搜索结果显示,我实例化IKernel kernel = new StandardKernel(); LoginDetailsVM loginDetails = kernel.Get<LoginDetailsVM>(); 两次可能是问题,但我不知道如何访问它。

肯定不得不绕过内核的一个实例有点失败了注入点之一?

此外,显式StandardKernel形式是获取实例的可接受选择,还是有更好的隐式方法来调用注入的构造函数?

对于这里似乎有点天真的理解道歉,我对Ninject和DI一般都是新手。

2 个答案:

答案 0 :(得分:3)

问题不在于传递内核 - 而是在你访问它的地方。如果你在作文根(App_Startup)之外引用它,那么创建一个新文章并不比传递你已创建的文章更好。

当您需要解决组合根之外的某些内容并且您不想引用容器时,一种解决方案是创建工厂。您需要解决问题的组件不会向容器询问它 - 它会向工厂询问它。

反过来,工厂被设置为从容器中解析它。但是,这是在组合根中设置的,工厂可以替换为不涉及容器的实现。因此,您仍然可以说您的组件不依赖于容器或与容器通信。

Here's some documentation关于配置Ninject以向工厂提供实例。

答案 1 :(得分:0)

将IOC容器想象成具有存储在其中的类型和对象实例的魔术字典。

如果你做了

Void a method (){
Var dictionary = new dictionary ();

dictionary.Add(typeof(IFOO), new Foo());
}

Void other_method(){

Var dictionary = new dictionary ();
IFOO instance =Dictionary[typeof(IFOO)];
// would you expect this to work?
}

单例模式通常用于提供对IOC容器的访问。