gpt4 book ai didi

c# - 在带有子窗体的 WinForms 应用程序中进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 13:58:34 24 4
gpt4 key购买 nike

假设一个主窗体有几个菜单项。每个菜单项将显示另一种形式。在这种情况下,以下代码是进行依赖注入(inject)的好方法吗?

public class MainForm: Form {
private IAboutForm _aboutForm;
private IOptionsForm _optionsForm;
private IDownloadsForm _downloadsForm;

MainForm(IAboutForm aboutForm, IOptionsForm optionsForm, IDownloadsForm downloadsForm) { // add as many form dependencies as required
_aboutForm = aboutForm;
_optionsForm = optionsForm;
_downloadsForm = downloadsForm;

InitializeComponent();
}

private void AboutMenuItem_Click(object sender, System.EventArgs e) {
_aboutForm.ShowDialog(this);
}

private void DownloadsMenuItem_Click(object sender, System.EventArgs e) {
_downloads.Show();
_downloads.BringToFront();
}

}

最佳答案

这按原样工作得很好,但它不能很好地扩展——如果你继续添加表单,你的构造函数将在一段时间后变得巨大。如果您再也不添加任何东西,那么您可能就没事了。如果你知道你会添加更多,或者认为你不会添加但最终还是这样做了,你可能想要注入(inject)某种 IFormFactory 来代替,如下所示:

IFormsFactory formsFactory;
MainForm(IFormsFactory formsFactory)
{
_formsFactory = formsFactory;
}

然后您可以根据需要创建依赖表单:

private void AboutMenuItem_Click(object sender, System.EventArgs e) {
IAboutForm aboutForm = _formsFactory.CreateAboutForm();
aboutForm.ShowDialog(this);
}

有几种方法可以解决这个问题。您可以将所有表单保留为成员变量,并仅使用注入(inject)的工厂在构造函数中创建它们。如果性能是一个问题,那么这很好,并且在程序的整个生命周期中,每个实例只需要一个实例。

请注意,如果需要,您也可以将“构造”参数添加到 factory.CreateXXX() 调用中。

在工厂内部,它会知道如何创建每个表单。如果您使用 IoC 容器,您甚至不需要创建 IFactory 接口(interface)的具体。如果创建表单有特殊的逻辑,那么您可能想要创建一个具体的,并将注入(inject)的 IFactory 解析为该具体的。

关于这个还有很多可以说的,但我认为这是一个很好的起点。希望对您有所帮助。

关于c# - 在带有子窗体的 WinForms 应用程序中进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com