我有一个相当大的crud winform应用程序,它有很多对象。个人,注册,计划,案例说明等。有30多个表格组成的应用程序与用户界面逻辑分解。会员、注册、计划、案例说明等。
我试图找出如何在搜索表单上搜索后创建person对象并将该对象传递到下一个请求的表单。不管是什么,让我们说人口统计。缺点是我需要person对象在整个应用程序中都可用,并且只能有一个。
现在我对设计模式的了解为零,但我正在尝试。我已经读过http://www.switchonthecode.com/tutorials/csharp-tutorial-singleton-pattern和http://www.yoda.arachsys.com/csharp/singleton.html了,但我想确保我正确理解如何将其应用于我的情况。
首先,示例说明您正在访问引用,对吗?我是搞错了还是需要访问值?
第二,我还需要做些什么才能让这个产品在全球范围内上市?我只是在每个表单上声明一个实例,但通过这个单例模式,这样就不会有更多的实例了吗?
谢谢
编辑1
为了澄清,所有的对象都是人的子对象。另外,当搜索页面消失时,用户可以选择不同的当前人。但他们一次只能和一个人互动。
最后,如我所说,我是一个婴儿在这方面,如果我应该考虑其他事情,请说不同的方法,如果你能提供一些解释为什么,我将非常感谢。
编辑2
根据医务人员的评论,我想我应该澄清一下。
首先,感谢迄今为止为我们做出贡献的每一个人。
第二,我不知道设计模式的第一件事,如果在我目前的情况下需要某种模式,我当然也没有最模糊的。
如果有人有更好、更简单的方法,或者在您看来,有更合适的方法将一个数据对象从一个窗体传递到另一个窗体,请告诉我。
最后,我只需要一种方法来跟踪我的用户从一个地方到另一个地方的信息。
谢谢您
最佳答案
您可以使用singleton模式来确保只创建了一个实例。
然而,(至少在我看来)这是否是一个好的决定。关于这件事,有很多关于SO和其他地方的报道。
我会从另一个角度来处理这个问题。我会让我所有的表单都采用构造函数中的person实例。这样,每种形式都只会担心它是人的实例。
您可以通过创建一个新的类来实现这一点,该类继承自表单,并为您的个人提供一个字段/属性/构造函数。然后,任何使用person的表单都可以从新类继承。
当然,您必须管理person对象的创建。你甚至可以用一个单子。然而,这样做的好处是,每个表单都不必知道如何创建一个人或是谁创建了这个人。这样,如果选择the jury is still out,就不必去更改对singleton实例的所有引用。
编辑:
这里有一些代码来演示这一点。我花了一段时间让设计师表现得很好。我不得不在personform中添加一个空的私有构造函数,以使设计器不抛出错误。
程序.cs
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyDerivedForm(new Person { Name = "Hello World!" }));
}
}
个人计算机
public class Person
{
public virtual string Name { get; set; }
}
人形.cs
using System;
using System.Windows.Forms;
public class PersonForm : Form
{
private readonly Person myPerson;
protected virtual Person MyPerson
{
get
{
return this.myPerson;
}
}
private PersonForm()
{
}
public PersonForm(Person person)
{
this.myPerson = person;
}
}
myderivedform.cs(添加名为label1的标签)
public partial class MyDerivedForm : SingletonMadness.PersonForm
{
public MyDerivedForm(Person person)
: base(person)
{
InitializeComponent();
}
private void MyDerivedForm_Load(object sender, EventArgs e)
{
label1.Text = this.MyPerson.Name;
}
}