2010-01-24 88 views
1

我想在我的WinForms应用程序中使用Ninject。我无法弄清楚如何将它用于我的用户控件。有时候他们依靠我想通过DI框架配置的服务。这些控件需要通过设计器进行管理(因此需要默认构造函数)。使用Ninject将依赖项注入外部构造的对象(用户控件)

那么,有没有办法将依赖关系注入到此用户控件的属性中?由于设计人员需要能够构造它,因此kernel.Get<TestClass>在这里不起作用。有没有一种方法或一些代码可以让我“填充”Form_OnLoad()方法中的依赖关系?

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

回答

2

我认为你需要反思你的想法。在Model View Controller中,视图只有一项责任:显示数据。

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

虽然没有针对Windows Forms的特定MVC框架,但可以手动制作粗糙的框架,或者您可以查看(现已退役)Composite Application Block以了解如何完成此操作(尽管CAB对于大多数人的口味来说可能过于复杂)。今天有更多优雅的选项,但它们涉及WPF。

在任何情况下,而不是注入到您的视图的依赖关系,注入到控制器,并让控制器实例化并正确填充视图(您的控件)。

以这种方式,您可以保持您的控件不受DI关注,因为它们应该是。

+0

好吧,我看到控制器应该最终有依赖关系。我一直在做MVC,先创建View,然后创建Controller。由于用户控件总是要由表单或其他控件创建,所以应该沿着单独的路径创建控制器? – Nathan 2010-01-25 03:08:59

+0

当我的myControl属性使用[Inject]属性时,我错误地使用kernel.Inject(myControl)? – Nathan 2010-01-25 03:14:47

+0

只要您意识到这意味着需要依赖Ninject本身,您就可以做到这一点。使用'kernel.Inject(myControl)'的 – 2010-01-25 05:23:22

1

我认为这个问题是什么DI工具可以用来获得依赖注入与Windows窗体的工作。每个人都会使用MVC示例,因为它很容易实现(如果在我们周围浮动,就好像它是新的和原始的一样)。如果你有使用WinForms甚至WPF的答案 - 这将是有益的。

这个答案在这里基本上说 - 在任何情况下,我不知道如此注入控制器和填充意见 - 真的吗?回到MVC?再次 - winforms。

+0

不太理解你的第二段。你是否在说,回应的人不应该建议改用MVC作为解决方案?就我个人而言,我使用ASP.NET WinForms,并没有将大型应用程序重写为MVC的计划。 – 2016-03-22 17:01:46