假设我有一个带有网格的应用程序,可让您查看所有客户。您在网格中选择一个客户行,然后单击“编辑”。
在非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();
}
新表格知道与哪个“客户”打交道的最佳方式是什么?在非IOC版本中,您只需将其作为参数传递。应该在这里使用二传手注入还是有一些更优雅的方法?
谢谢。
由于您与工厂签有合同,我相信这里的二传手注射是一个干净的解决方案。您只有一个通用的工厂方法,看起来可以将其重用于不同的视图类型。
将参数传递给工厂方法,以便随后可以将其用于构造函数注入
_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 );
我个人会考虑第二种方法,但是,这取决于在您的特定情况下实际上对您最重要的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句