使用依赖注入在 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 );
就我个人而言,我会考虑第二种方法,但是,这取决于在您的具体情况下什么对您来说最重要。
假设我有一个带有网格的应用程序,可以让您查看所有客户。您在网格中选择一个客户行并单击 "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 );
就我个人而言,我会考虑第二种方法,但是,这取决于在您的具体情况下什么对您来说最重要。