我目前正在制作一个WinForms系统(我知道)在创建表单时有很多Constructor Injection
,但如果这些表单/视图需要打开另一个表单,我发现DI容器也被注入了,所以我们可以在运行时查找所需视图界面的实现。例如如何避免服务定位符模式?我是不是该?
public partial class MyView : Form, IMyView
{
private readonly IDIContainer _container;
public MyView(IDIContainer container)
{
InitializeComponent();
_container = container;
}
public OpenDialogClick(object sender, EventArgs e)
{
var dialog = container.Resolve<IDialogView>();
dialog.ShowDialog(this);
}
}
我知道这基本上是使用容器作为服务定位器。我一再被告知这被认为是反模式,所以我想避免这种用法。
我大概可以注入视图这样构造的一部分:
public partial class MyView : Form, IMyView
{
private readonly IDialogView _dialog;
public MyView(IDialogView dialog)
{
InitializeComponent();
_dialog = dialog;
}
public OpenDialogClick(object sender, EventArgs e)
{
dialog.ShowDialog(this);
}
}
但如果对话视图是实例相当昂贵呢?
有人建议我们创建一种内部使用DI容器的表单工厂,但对我来说,这看起来像是简单地创建另一个服务定位器的包装。
我知道,在某些时候,东西必须知道如何创建一个IDialogView,所以我想,要么当复合根目录中创建(可能不理想,如果有多种形式,它的解决,一些或所有创建都很昂贵),或者复合根本身有解决依赖关系的方法。在这种情况下,组合根必须具有类似于服务定位器的依赖关系?但那么孩子的形式如何创建这样的对话框呢?他们会通过事件来调用复合对象来打开这样的对话框吗?
我一直遇到的一个特殊问题是容器几乎不可能轻易地模拟。这部分是让我思考形式工厂的想法,尽管它只是一个包装容器的包装。这是一个明智的理由吗?
我是不是觉得自己陷入了困境?有没有简单的方法通过这个?或者我只是剪了结,找到适合我的东西?
不幸的是,您的网站因为“恶意软件的恶名”而被我的组织阻止:( – adhocgeek
有趣的是,博客如何可能产生“恶意软件的恶名”?这绝对是您组织方面的一些东西。 –
这绝对是我的公司防火墙,有趣的是,它似乎现在加载......也许这是与您的网站上的广告有关吗? – adhocgeek