Ninject 无法解决 WPF 中的构造函数注入问题



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

void App_Startup(object sender, StartupEventArgs e)
{
IKernel _Kernel = new StandardKernel();
_Kernel.Load(Assembly.GetExecutingAssembly());
}

然后我有一个NinjectModel扩展类,其 Load 方法由上述方法调用,并且绑定发生如下:

Bind<Inheritance.IWindowProvider>().To<WindowProvider>().InSingletonScope();

然后,我的视图模型采用IWindowProvider,在本例中,我还添加了[Inject]属性。

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

其他地方(在另一个 VM 中(,我想创建此视图模型的实例:

IKernel kernel = new StandardKernel();
LoginDetailsVM loginDetails = kernel.Get<LoginDetailsVM>();

但是我收到"可怕"错误:

激活 IWindowProvider 时出错

没有匹配的绑定可用, 并且该类型不可自绑定。

我最初的搜索发现我实例化StandardKernel两次可能是问题所在,但我不确定如何以其他方式访问它。

当然,必须传递内核的实例在某种程度上会破坏注入的要点之一吗?

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

很抱歉,这里似乎很天真的理解,我对 Ninject 和 DI 完全陌生。

问题不在于遍历内核 - 而是您访问它的位置。如果你在合成根(App_Startup(之外引用它,那么创建一个新的并不比传递你已经创建的根更好。

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

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

以下是有关配置 Ninject 以向工厂提供实例的一些文档。

将 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 容器的访问。

最新更新