C# Ninject未在现有winforms应用程序中注入

C# Ninject未在现有winforms应用程序中注入,c#,winforms,ninject,C#,Winforms,Ninject,我觉得这只是我在winforms中对DI的误解 我正在尝试在现有的winforms应用程序中实现。在Program.cs中,我正在做类似于 IKernel kernel = new StandardKernel(new NinjectBindings()); Application.Run(kernel.Get<MainContainer>()); 该应用程序编译并运行良好,但my _filterEngine实例为null,并且从未调用AddFilterEngine方法。这是因为搜

我觉得这只是我在winforms中对DI的误解

我正在尝试在现有的winforms应用程序中实现。在Program.cs中,我正在做类似于

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

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

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


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

您需要为Ninject使用字段或属性设置器来在对象创建时注入您的值

[Inject]  
public IFilterEngine FilterEngine { get; set; }
如果不知道该属性是公共的,还可以将其作为参数传递给构造函数。这是首选的方法。遵循Ninject网站上的示例

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