我有一种感觉,这只是我在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创建?
答案 0 :(得分:1)
仅在通过Ninject创建实例时才会发生注入,即通过调用Kernel.Get<T>()
,这通常只在应用程序中的“最顶层”点完成,或者由Ninject自己创建此实例。
因此,除非您通过使用自绑定或容器(例如构造函数参数)调用Kernel.Get<SearchResult>()
(假设类称为SearchResult
)来创建usercontrol,否则您的方法永远不会得到不幸的是,援引了。
答案 1 :(得分:0)
您需要使用字段或Ninject的Property setter来在对象创建时注入您的值。
[Inject]
public IFilterEngine FilterEngine { get; set; }
如果您不将此属性公开,您也可以将其作为参数传递给构造函数。这是首选方法。按照Ninject网站上的示例进行操作。