我有多个互相交互的winforms。一个表单允许用户输入一组属性然后验证它们,并通过单击按钮移动到下一个表单。用户可以选择在任何时间退出并转到上一个表单。
我有一个业务对象类,它记录了基本属性的值。
最初,我使用简单的天真参数在表单之间交换值。例如,让我们说Form1和Form2。在按钮上单击“下一步”,将隐藏Form1并显示Form2: -
// event of button click "Next" on Form1.cs //
private void btnNext_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2 (myTxtBoxValue.Text);
form2.Show();
this.Hide();
}
// constructor in Form2.cs //
public Form2(string myTxtBoxValue)
{
InitializeComponent();
TransactionBO trans = new TransactionBO();
trans.myValue = myTxtBoxValue; // <-- this gets the value accurately.
}
// my Business Object class is called TransactionBO.cs //
class TransactionBO
{
public string myValue {get;set;}
}
然而,有人告诉我,更好的方法是使用单身人士。原因是,“最好不要将form2绑定到form1,创建依赖关系可能会降低未来的灵活性/可伸缩性”。
有人可以向我解释原因吗?我如何使用Singletons(我知道Singletons的基本原理是什么,我是否必须创建一个单独的单例类,或者我可以使用TransactionBO.cs类在表单之间传递值)?
答案 0 :(得分:2)
让我们解决同事对依赖关系的担忧。
只是进行水平设置,让我们看一些拓扑图。想象一下,这些是依赖图。
根据细节,您当前的设计将具有依赖关系图,该关系图可以是线,网格,也可以是“完全连接”。所有这些图都具有以下属性:图中任何单个节点的代码更改都需要检查,并且可能需要更改其他许多点,并且在某些情况下,必须查看所有。这很糟糕。
我们更喜欢的是更简单的图表。例如,树更简单。但最好的是明星。在星形图中,您只有成对依赖关系;对任何一个节点的更改都需要检查最多一个其他节点。这意味着对修改有更好的隔离和弹性。
那么,我们如何在您的案例中获得星图?我就是这样做的。
定义一个代表整个工作流程的新类。例如,如果它是注册服务的工作流程,您可以将其称为EnrollmentWorkflow
。在这个例子中,我只称它为Workflow
。
为Workflow
提供一系列字段和公共属性,代表您需要从用户收集的每个数据项。
在启动多步骤用户界面的代码中,创建一个新的Workflow
实例并将其传递给第一个表单的构造函数。
在用户完成表单时触发的事件处理程序中,添加代码以将所有表单的字段复制到Workflow
的属性中。然后实例化下一个表单,在构造函数中传递相同的Workflow实例。
在下一个表单中,您可以阅读Workflow对象中所需的所有值。
继续这样做直到最后一步完成,此时您将工作流程传递到业务逻辑层进行处理。
如果您愿意,可以在工作流程中添加帮助方法,例如数据查找,字段验证等,以便它们全部包含在一个地方。
如果用户需要保存进度并稍后恢复,那么将工作流作为序列化对象保留是一件非常简单的事情,只需要少量工作。
最后,Workflow对象将成为星形图的中心,表单将是周边的节点。这样,您最终会得到一个漂亮,简单的依赖图,以及一个易于修改的好设计。