【问题标题】:how to get dependencies injected in constructors in Windows Forms如何在 Windows 窗体的构造函数中注入依赖项
【发布时间】:2011-01-13 16:12:28
【问题描述】:

在 asp.net-mvc 中,我有 Windsor 控制器工厂,它将所有依赖项注入到控制器中,但是您如何在 Windows 窗体中获得它?

例如,如果有这个 Form1,我将如何获取 Form1 的实例,我应该使用 resolve(某些人称之为 ServiceLocator 和反模式)吗?

public class Form1
{
   private IBarService _barService;

   public Form1(IBarService barService)
   {
       _barService = barService;
   }
}

【问题讨论】:

    标签: c# winforms inversion-of-control castle-windsor ioc-container


    【解决方案1】:

    对表单(或其他 UI 框架中的其他视图)使用 构造函数注入 通常会出现问题,因为 Visual Studio 设计者期望并假定默认构造函数。

    在任何情况下,Form 或其他可视控件确实应该是没有行为的哑 View。它的目的是显示您绑定到它的任何数据。使用数据绑定功能通常有助于将您限制在这种被动的显示形式中。

    这意味着您需要某种 Controller 来实例化视图(表单)并将数据源绑定到它。

    使用 WPF 等技术更容易做到这一点,但也可以使用 Windows 窗体。对于如何使用 Windows 窗体执行此操作的灵感,我建议您查看(现已退休)Composite Application Block - 它过于复杂,但它应该为您提供一些关于如何实现的想法你自己也有类似的。

    【讨论】:

    • 为了VS设计器的兼容性,你可以提供一个私有的默认构造函数,让你的公共构造函数调用默认的。
    • @Mark,几年前我在 CAB 做过一些工作——没听说它已经退役。你在哪里发现它被淘汰了?
    • @Eren Aygunes:好点——我不知道。但是,它并没有真正改变我的答案,因为从设计的角度来看,被动视图更适合控件的概念。
    • @mreith:也许“退休”这个词的选择不好,但请记住,CAB 从来都不是产品。它没有被更新或发展,主要是因为 Windows 窗体作为一种技术本身并没有看到更多的发展。
    【解决方案2】:

    是的,在 program.cs 中,您应该让 windsor 解析 Form1。为了能够在设计器中查看表单,您添加了一个空构造函数并使用Obsolete 属性对其进行装饰。

    【讨论】:

    • Obsolete 方法不起作用,设计器仍然显示损坏
    猜你喜欢
    • 1970-01-01
    • 2011-02-02
    • 2018-06-17
    • 1970-01-01
    • 2021-09-08
    • 2018-01-17
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多