0

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

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

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

我的 NinjectBindings 有

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

然后在 MainContainer 表单的客户用户控件(SearchResults.cs)中,我尝试像这样使用方法注入

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

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

4

2 回答 2

1

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

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

于 2013-06-04T15:11:23.117 回答
0

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

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

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

于 2013-08-20T01:00:51.223 回答