我的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一般都是新手。
答案 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容器的访问。