使用依赖注入在Windows窗体中打开一个新的参数化窗口

编码ninja345

假设我有一个带有网格的应用程序,可让您查看所有客户。您在网格中选择一个客户行,然后单击“编辑”。

在非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版本中,您只需将其作为参数传递。应该在这里使用二传手注入还是有一些更优雅的方法?

谢谢。

威克多(Wiktor Zychla)

由于您与工厂签有合同,我相信这里的二传手注射是一个干净的解决方案。您只有一个通用的工厂方法,看起来可以将其重用于不同的视图类型。

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

_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C中打开一个新的终端窗口

来自分类Dev

从另一个窗体打开新的Windows窗体

来自分类Dev

在页面加载中如何打开一个新的弹出窗口

来自分类Dev

使用CMD命令打开一个新的Powershell窗口

来自分类Dev

打开一个窗体作为子窗体

来自分类Dev

在目标框架中打开一个窗口

来自分类Dev

单击任务栏中的打开程序将打开一个新程序,而不是切换到Windows 7上的该窗口。

来自分类Dev

使用自定义网址打开一个新的Chrome窗口,然后使用Autohotkey获得相同的窗口吗?

来自分类Dev

使用jquery / C#Razor在Same session中打开一个新窗口

来自分类Dev

在RSelenium中打开一个新标签

来自分类Dev

在C ++中打开一个新的终端屏幕

来自分类Dev

在RSelenium中打开一个新标签

来自分类Dev

我想打开一个新标签而不是一个弹出窗口

来自分类Dev

如果Apple Script没有(或只是信息窗口),则打开一个新的Finder窗口?

来自分类Dev

如何从窗口管理器的键盘绑定中,在与上次使用的终端相同的目录中打开一个新终端?

来自分类Dev

Interactive Document中的Shiny renderPlot打开一个带有刻度图的新浏览器窗口

来自分类Dev

在 Xamarin.Mac 中从其他人打开一个新的自定义窗口

来自分类Dev

Mac:在Filezilla中使用Sublime文本进行编辑总是会打开一个新的Sublime窗口

来自分类Dev

如何以编程方式将一个按钮添加到我的 Windows 窗体中,该按钮将在单击时打开一个宏?

来自分类Dev

以编程方式打开一个新窗口(或新选项卡),而不总是打开一个弹出窗口

来自分类Dev

按键在Windows 7资源管理器中打开一个新窗口?

来自分类Dev

打开一个新的javascript窗口(.open)及其CSS样式

来自分类Dev

单击链接打开一个新的浏览器窗口

来自分类Dev

Applescript在当前空间中打开一个新的终端窗口

来自分类Dev

Pencil 2.0.9会打开一个新的firefox窗口,而不是软件本身

来自分类Dev

单击链接打开一个新的浏览器窗口

来自分类Dev

每次启动CMD都会打开一个新的文件浏览器窗口

来自分类Dev

防止 Ubuntu 在每次点击时打开一个新的 Firefox 窗口

来自分类Dev

Kde,从 bash 脚本打开一个新的终端窗口到 ssh

Related 相关文章

  1. 1

    在C中打开一个新的终端窗口

  2. 2

    从另一个窗体打开新的Windows窗体

  3. 3

    在页面加载中如何打开一个新的弹出窗口

  4. 4

    使用CMD命令打开一个新的Powershell窗口

  5. 5

    打开一个窗体作为子窗体

  6. 6

    在目标框架中打开一个窗口

  7. 7

    单击任务栏中的打开程序将打开一个新程序,而不是切换到Windows 7上的该窗口。

  8. 8

    使用自定义网址打开一个新的Chrome窗口,然后使用Autohotkey获得相同的窗口吗?

  9. 9

    使用jquery / C#Razor在Same session中打开一个新窗口

  10. 10

    在RSelenium中打开一个新标签

  11. 11

    在C ++中打开一个新的终端屏幕

  12. 12

    在RSelenium中打开一个新标签

  13. 13

    我想打开一个新标签而不是一个弹出窗口

  14. 14

    如果Apple Script没有(或只是信息窗口),则打开一个新的Finder窗口?

  15. 15

    如何从窗口管理器的键盘绑定中,在与上次使用的终端相同的目录中打开一个新终端?

  16. 16

    Interactive Document中的Shiny renderPlot打开一个带有刻度图的新浏览器窗口

  17. 17

    在 Xamarin.Mac 中从其他人打开一个新的自定义窗口

  18. 18

    Mac:在Filezilla中使用Sublime文本进行编辑总是会打开一个新的Sublime窗口

  19. 19

    如何以编程方式将一个按钮添加到我的 Windows 窗体中,该按钮将在单击时打开一个宏?

  20. 20

    以编程方式打开一个新窗口(或新选项卡),而不总是打开一个弹出窗口

  21. 21

    按键在Windows 7资源管理器中打开一个新窗口?

  22. 22

    打开一个新的javascript窗口(.open)及其CSS样式

  23. 23

    单击链接打开一个新的浏览器窗口

  24. 24

    Applescript在当前空间中打开一个新的终端窗口

  25. 25

    Pencil 2.0.9会打开一个新的firefox窗口,而不是软件本身

  26. 26

    单击链接打开一个新的浏览器窗口

  27. 27

    每次启动CMD都会打开一个新的文件浏览器窗口

  28. 28

    防止 Ubuntu 在每次点击时打开一个新的 Firefox 窗口

  29. 29

    Kde,从 bash 脚本打开一个新的终端窗口到 ssh

热门标签

归档