在多个窗口之间切换

问题描述

我们有一个支持多种变体的软件系统。每个变体都应包含一个或多个UI组件(在这种情况下为Windows窗体)的自定义版本。

已在VS2017中创建了一个原型,并具有以下解决方案; ProductFoo(解决方案)

  • MainApplication(Windows应用程序)
    • MainApplicationForm1.cs(Windows窗体)
  • XY1(类库)
    • Form1.cs((Windows窗体)
  • XY2(类库)
    • Form1.cs((Windows窗体)

在这个简单的原型中,MainApplicationForm1表单包含一个按钮,单击时应根据选择的变体在XY1和XY2库中显示Form1.cs

解决此问题,我们使用以下解决方案配置更新了解决方案管理器;

  • XY1_Debug
  • XY1_发布
  • XY2_Debug
  • XY2_发布

然后我们为MainApplication添加了条件编译符号。

  • 解决方案配置XY1_Debug和XY1_Release使用条件符号XY1
  • 解决方案配置XY2_Debug和XY2_Release使用条件符号XY2

然后,我们将MainApplication的引用添加到XY1和XY2项目中。

最后,我们在MainApplicationForm1.cs中添加了以下代码

public partial class MainAppForm1 : Form
{
    public MainAppForm1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender,EventArgs e)
    {
    #if XY1
        XY1.Form1 form = new XY1.Form1();
        form.ShowDialog();
    #elif XY2
        XY2.Form1 f1 = new XY2.Form1();
        f1.ShowDialog();
    #else
        #error The MainApplication is missing Form1
    #endif
    }
}

解决方案有效,但我对使用预处理程序指令有所保留。该代码看起来很凌乱,并且很快会变得难以维护。这种情况下的最佳做法是什么?

感谢任何输入。

解决方法

您的问题很广泛,涉及您要拥有的项目的基本结构。

您选择的方式接近Feature toggling,只是基于构建配置而已。通常,它应该类似于:

if(features.IsOn("XY1-feature")){
    XY1.Form1 form = new XY1.Form1();
    form.ShowDialog();
}

经典方式可以为您提供更大的灵活性。例如。将功能切换到配置可以使您有可能动态切换不同功能以进行特定部署,但是作为影响,这会增加复杂性并需要更多测试

我建议您更深入地研究Dependency injectionStrategy pattern

作为功能切换的替代方法,您可以使用分支。为特定的项目/客户创建一个特定的分支。这可能会给您带来合并方面的问题,但会使您的清洁度保持特定的实现水平。各个项目之间的细微差异会使其最适合该项目

,

我建议使用两个单选按钮来解决此问题。这是一个非常简单的方法。

选择radioButton1,弹出XY1​​.Form

选择radioButton2,弹出XY2.Form

MainApplicationForm1.cs:

private void radioButton1_CheckedChanged(object sender,EventArgs e)

    {
        if (radioButton1.Checked) 
        {
            XY1.Form1 form = new XY1.Form1();
            form.Show();                
        }
        
    }
    private void radioButton2_CheckedChanged(object sender,EventArgs e)
    {
        if (radioButton2.Checked)
        {
            XY2.Form1 f1 = new XY2.Form1();
            f1.Show();               
        }
    }