如何在Windows窗体中的构造函数中注入依赖项

Omu*_*Omu 9 c# castle-windsor ioc-container inversion-of-control winforms

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

例如,如果有这个Form1,我将如何获得Form1的实例,我应该使用resolve(由某个ppl称为ServiceLocator和反模式)?

public class Form1
{
   private IBarService _barService;

   public Form1(IBarService barService)
   {
       _barService = barService;
   }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 7

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

在任何情况下,Form或其他视觉控件都应该是一个没有行为的愚蠢视图.它的目的是显示绑定到它的任何数据.使用数据绑定功能通常有助于将您限制为这种被动的显示形式.

这意味着您需要某种Controller,它可以实例化View(Form)并将数据源绑定到它.

使用WPF等技术更容易实现,但Windows Forms也可以实现.有关如何使用Windows窗体执行此操作的灵感,我建议您查看(现已退役)复合应用程序块 - 它过于复杂,但它应该为您提供有关如何自己实现类似内容的一些想法.

  • @mreith:也许'退役'是一个糟糕的选择,但请记住,CAB从来都不是*产品*.它没有被更新或发展,主要是因为Windows Forms作为一种技术本身并没有看到更多的进化. (3认同)

Kla*_*sen 5

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