为什么我的C#Singleton不工作?

时间:2013-12-10 11:12:44

标签: c# winforms singleton

我是.net的新手,这也是我在这里的第一篇文章,所以我可以提前为我可能正在做的任何新错误道歉:)

问题的背景。 我正在开发一个C#项目,作为其中的一部分,我必须将windows表单数据存储到数据库中。我正在使用数据类“人”将Windows表单数据传输到负责代表Windows窗体访问数据库的类。我希望在Windows窗体代码上使用Singleton模式来防止窗口的多个实例存在。

问题 在保存按钮事件处理代码中,我希望创建一个“Person”对象,用用户输入的值填充它并发送它以保存到数据库中。问题出在这里。 “人物”对象没有填充! 我试过用另一种形式做这个,我没有修改代码以适应单例模式,并且有效。

那我在这里做错了什么?有没有办法让我保持单身模式并使其有效?

窗口表单代码

namespace AgTrain
{
    public partial class CreateAdmin : Form
    {
        private static CreateAdmin instance;

        private CreateAdmin()
        {
            InitializeComponent();
        }

        private void CreateAdmin_Load(object sender, EventArgs e)
        {

        }

        public static CreateAdmin getInstance()
        {
            if(instance==null)
            {
                instance = new CreateAdmin();
                instance.InitializeComponent();
            }
            return instance;
        }

        public void makeInstanceNull()
        {
            instance = null;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Person personToBeSaved = new Person();
            PersonDAO personDAO = new PersonDAO();


            personToBeSaved.FirstName = textBox1.Text;
            personToBeSaved.LastName = textBox2.Text;
            personToBeSaved.Address = textBox3.Text;
            personToBeSaved.TelNo = textBox4.Text;
            personToBeSaved.UserName = textBox5.Text;
            personToBeSaved.Password = textBox6.Text;
            personToBeSaved.UserType = "admin";

            personDAO.addPerson(personToBeSaved);           
        }

    }
}

来电者代码

private void createAdminToolStripMenuItem_Click(object sender, EventArgs e)
    {
        CreateAdmin creAdmin = CreateAdmin.getInstance();
        creAdmin.Closed += (s, ex) => { creAdmin.makeInstanceNull(); };
        creAdmin.MdiParent=this;
        creAdmin.Show();
    }

感谢。 Dumidu

2 个答案:

答案 0 :(得分:0)

您正在拨打InitializeComponent两次。 试试这个:

private static CreateAdmin _instance;
public static CreateAdmin Instance
{
    get { return _instance ?? (_instance = new CreateAdmin()); }
}

答案 1 :(得分:0)

在我的观点中,filoe的解决方案是最干净的,但是还有可能在C#中引入(有效的)单例:

public static readonly CreateAdmin Instance = new CreateAdmin();

客户代码:

CreateAdmin.Instance.DoSomething()

但正如已经提到的,我推荐了菲尔的方式!

相关问题