Ninject没有注入现有的winforms应用程序

时间:2013-06-04 14:49:42

标签: c# winforms ninject

我有一种感觉,这只是我在winforms中对DI的误解。

我正在尝试将Ninject实施到现有的winforms应用中。在Program.cs中,我正在做类似于

的事情
IKernel kernel = new StandardKernel(new NinjectBindings());
Application.Run(kernel.Get<MainContainer>());

我的NinjectBindings

Bind<IFilterEngine>().To<FilterEngine>();

然后在MainContainer表单形式的客户usercontrol(SearchResults.cs)中,我试图像这样使用方法注入

[Inject]
public void AddFilterEngine(IFilterEngine filterEngine)
{
   _filterEngine = filterEngine;
}

应用程序编译并运行正常但是,我的_filterEngine实例为null,并且从不调用AddFilterEngine方法。这是因为SearchResults不是用Ninject创建的吗?它以其父形式硬编码。如果是这样,我假设从这一点开始每个父母也需要用Ninject创建?

2 个答案:

答案 0 :(得分:1)

仅在通过Ninject创建实例时才会发生注入,即通过调用Kernel.Get<T>(),这通常只在应用程序中的“最顶层”点完成,或者由Ninject自己创建此实例。

因此,除非您通过使用自绑定或容器(例如构造函数参数)调用Kernel.Get<SearchResult>()(假设类称为SearchResult)来创建usercontrol,否则您的方法永远不会得到不幸的是,援引了。

答案 1 :(得分:0)

您需要使用字段或Ninject的Property setter来在对象创建时注入您的值。

[Inject]  
public IFilterEngine FilterEngine { get; set; }

如果您不将此属性公开,您也可以将其作为参数传递给构造函数。这是首选方法。按照Ninject网站上的示例进行操作。