Winforms 使用Ninject将依赖项注入外部构造的对象(用户控件)

Winforms 使用Ninject将依赖项注入外部构造的对象(用户控件),winforms,dependency-injection,ioc-container,ninject,Winforms,Dependency Injection,Ioc Container,Ninject,我想在WinForms应用程序中使用Ninject。我不知道如何将它用于我的用户控件。有时,它们依赖于我希望通过DI框架配置的服务。这些控件需要通过设计器进行管理(因此需要默认构造函数) 那么,有没有一种方法可以将依赖项注入到这个用户控件的属性中?由于设计者需要能够构造它,kernel.Get在这里不起作用。是否有一种方法或一些代码可以让我在Form_OnLoad()方法中“填写”依赖项 我还可以想到其他一些例子,我想将其注入到一个已经存在的对象的属性中,但是WinForms用户控件是最容易解释

我想在WinForms应用程序中使用Ninject。我不知道如何将它用于我的用户控件。有时,它们依赖于我希望通过DI框架配置的服务。这些控件需要通过设计器进行管理(因此需要默认构造函数)

那么,有没有一种方法可以将依赖项注入到这个用户控件的属性中?由于设计者需要能够构造它,
kernel.Get
在这里不起作用。是否有一种方法或一些代码可以让我在
Form_OnLoad()
方法中“填写”依赖项


我还可以想到其他一些例子,我想将其注入到一个已经存在的对象的属性中,但是WinForms用户控件是最容易解释的。

我认为您需要颠倒您的想法。在中,视图只有一个职责:显示数据

数据如何到达那里是控制器的责任,数据在内存中的表示方式由模型决定

虽然没有针对Windows窗体的特定MVC框架,但是可以手动制作粗糙的框架,或者您可以查看一下(现已退役)以了解如何实现这一点(尽管CAB对于大多数人来说可能过于复杂)。现在有更多优雅的选择,但它们涉及WPF

在任何情况下,不要将依赖项注入视图,而是将它们注入控制器,让控制器实例化并正确填充视图(控件)


通过这种方式,您可以保持控件不受DI的影响,这是应该的。

我认为问题在于,您可以使用什么DI工具使依赖项注入与windows窗体一起工作。每个人都会使用MVC示例,因为它很容易实现(如果在we周围浮动,就如同它是新的和原始的一样)。如果您有一个使用winforms甚至WPF的答案,那将是很有帮助的


这里的答案基本上是这样的——在任何情况下,我都不知道,所以将它们注入控制器并填充视图——真的吗?回到MVC?同样-winforms。

好的,我看到控制器最终应该具有依赖关系。我一直在做MVC,先创建视图,然后再创建控制器。由于用户控件总是由窗体或其他控件创建,控制器是否应该沿着单独的路径创建?当myControl具有属性为[Inject]的属性时,使用kernel.Inject(myControl)是否错误?您可以这样做,只要您意识到这意味着依赖于Ninject本身。使用
kernel.Inject(myControl)
也有点接近服务定位器模式,这通常是不鼓励的。通过将无参数构造函数标记为private(这样表单设计器仍然可以工作),然后使用构造函数注入(记住调用无参数构造函数或
InitializeComponent()
),您可以在winforms中使用构造函数注入在运行时编写应用程序。不太理解第二段。你是说人们不应该建议把MVC作为解决方案吗?就我个人而言,我使用ASP.NET WinForms,没有将大型应用程序重写为MVC的计划。