在多个 windows 之间切换
Switch between multiple windows
我们有一个应该支持多个变体的软件系统。每个变体应包含一个或多个 UI 组件的自定义版本(在本例中为 Windows 表单)。
已在VS2017中创建原型,解决方案如下;
ProductFoo(解决方案)
- MainApplication(Windows 应用程序)
- MainApplicationForm1.cs(Windows 表格)
- XY1(Class 库)
- Form1.cs ((Windows 表格)
- XY2(Class 库)
- Form1.cs ((Windows 表格)
在这个简单的原型中,MainApplicationForm1 表单包含一个按钮,单击该按钮时应根据选择的变体在 XY1 和 XY2 库中显示 Form1.cs
。
为了解决这个问题,我们使用以下解决方案配置更新了解决方案管理器;
- XY1_Debug
- XY1_Release
- XY2_Debug
- XY2_Release
然后我们为 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 injection and Strategy pattern
作为功能切换的替代方法,您可以使用分支。为特定的 project/client 创建一个特定的分支。这可能会给你带来合并问题,但会让你的特定实现更干净。它最适合项目之间有很多细微差别的项目
我建议使用两个单选按钮来解决这个问题。这是一个非常简单的方法。
SelectradioButton1,弹出XY1.Form
SelectradioButton2,弹出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();
}
}
我们有一个应该支持多个变体的软件系统。每个变体应包含一个或多个 UI 组件的自定义版本(在本例中为 Windows 表单)。
已在VS2017中创建原型,解决方案如下; ProductFoo(解决方案)
- MainApplication(Windows 应用程序)
- MainApplicationForm1.cs(Windows 表格)
- XY1(Class 库)
- Form1.cs ((Windows 表格)
- XY2(Class 库)
- Form1.cs ((Windows 表格)
在这个简单的原型中,MainApplicationForm1 表单包含一个按钮,单击该按钮时应根据选择的变体在 XY1 和 XY2 库中显示 Form1.cs
。
为了解决这个问题,我们使用以下解决方案配置更新了解决方案管理器;
- XY1_Debug
- XY1_Release
- XY2_Debug
- XY2_Release
然后我们为 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 injection and Strategy pattern
作为功能切换的替代方法,您可以使用分支。为特定的 project/client 创建一个特定的分支。这可能会给你带来合并问题,但会让你的特定实现更干净。它最适合项目之间有很多细微差别的项目
我建议使用两个单选按钮来解决这个问题。这是一个非常简单的方法。
SelectradioButton1,弹出XY1.Form
SelectradioButton2,弹出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();
}
}