使用依赖注入在 Windows 表单中打开一个新的参数化 window

Opening a new parameterized window in Windows Forms using Dependency Injection

假设我有一个带有网格的应用程序,可以让您查看所有客户。您在网格中选择一个客户行并单击 "Edit"。

在非 IOC WinForms 中,事件处理程序如下所示:

public void OnBtnEditClick(object sender, EventArgs e)
{
    var customer = grid.SelectedRow.Object as Customer;
    var dialog = new EditCustomerDialog(customer);
    dialog.ShowDialog();
}

如果我使用 Windsor 作为我的容器,我的理解是这看起来像:

// Injected by container and set in constructor of Form
private readonly IViewFactory _viewFactory;

public void OnBtnEditClick(object sender, EventArgs e)
{
    var customer = grid.SelectedRow.Object as Customer;
    var dialog = _viewFactory.CreateView<EditCustomerDialog>();
    dialog.ShowDialog();
}

新表单了解它正在处理哪个 "customer" 的最佳方式是什么?在非 IOC 版本中,您只需将其作为参数传递即可。这里应该使用 setter 注入还是有更优雅的方式?

谢谢。

我相信 setter 注入是一个干净的解决方案,因为你的工厂合同。您有一个单一的通用工厂方法,看起来它可以重用于不同的视图类型。

将参数传递给工厂方法,以便随后可以将其用于构造函数注入

_viewFactory.CreateView<ViewType>( params );
// factory uses params for constructor injection

这两个看起来像代码味道,泛型参数和实际参数列表在这种调用中在语法上不相关。换句话说,很容易将错误的泛型参数与错误的参数列表混在一起。

另一方面

ViewType view = _viewFactory.CreateView<ViewType>();
view.Param1 = ...;

看起来没问题,视图类型是强类型协定,无法使参数不匹配。

但另一种方法是缩小工厂方法的范围

ViewType view = _viewFactory.CreateViewType( params );

即工厂中有一堆工厂方法,每个工厂方法负责特定的视图类型和完整的参数列表。

最后一个想法,一个参数对象,这是前面提到的两个之间的交易 - 你有一个单一的工厂方法,但有一个参数层次结构

ViewTypeParams params = new ViewTypeParams();
params.Param1 = value;

BaseView view = _viewFactory.CreateView( params );

就我个人而言,我会考虑第二种方法,但是,这取决于在您的具体情况下什么对您来说最重要。