2013-12-10 3 views
2

메신저 나 .net에 새로 온 것입니다.이 글은 내 첫 번째 게시물이기 때문에 사전에 사과하고 있어도 내가 할 수있는 newb 실수는 없습니다.C# Singleton이 작동하지 않는 이유는 무엇입니까?

배경 문제. 저는 C# 프로젝트를 만들고 있는데, 그 중 일부분으로 윈도우 폼 데이터를 데이터베이스에 저장해야합니다. 나는 윈도우 폼 대신에 데이터베이스에 접근하는 책임을지는 클래스에 윈도우 폼 데이터를 전송하기 위해 "person"이라는 데이터 클래스를 사용하고있다. Windows의 다중 인스턴스가 존재하지 않도록하기 위해 Windows Forms 코드에서 Singleton 패턴을 사용하고자합니다. 내가하는 "사람"개체를 만들어 사용자 입력 값을 채우고 보내하고자하는 저장 버튼 이벤트 처리 코드에서

문제 는 데이터베이스에 저장합니다. 문제가 발생합니다. "사람"개체가 채워지지 않습니다! 싱글 톤 패턴을 수용하기 위해 코드를 수정하지 않은 다른 폼에서이 작업을 시도해 보았습니다.

여기서 내가 뭘 잘못하고 있니? 싱글 톤 패턴을 유지하고 작동하게하는 방법이 있습니까?

윈도우 폼 코드

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(); 
    } 

감사합니다. 두미두

+3

'InitializeComponent'를 두 번 호출했습니다. – Alberto

+0

예. 감사합니다 –

+1

주제를 벗어날 수 있습니다,하지만 내 생각에 양식 * 결코 * 싱글 톤 패턴을 구현해서는 안됩니다! 데이터를 폼 안팎으로 올바르게 전송할 수 없다면, 그것은 다른 질문에 대한 문제입니다. 그러나 게시 한 코드에서 싱글 톤을 작성하는 가장 작은 이유는 전혀 볼 수 없습니다. –

답변

0

InitializeComponent 번은 두 번 호출합니다. 내 opionion에서

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

여전히 속성에 익숙합니다. 감사합니다 :) –

0

이 thefiloe의 솔루션 깨끗한이지만, C#에서 (유효) 싱글 소개하는 더 가능성이있다 : 그 시도

public static readonly CreateAdmin Instance = new CreateAdmin(); 

클라이언트 코드 :

CreateAdmin.Instance.DoSomething() 

그러나 이미 언급 한 것처럼 나는 thefiloe의 길을 추천합니다!

+0

하지만이 패턴을 사용하여 양식을 만들 수 있습니까? UI 스레드에서이 작업을 수행해야한다는 요구 사항이 있습니까? – CodesInChaos

+0

죄송합니다. 대상 클래스가 양식이라는 점을 간과했습니다. @ CodeInChaos : 당신 말이 맞아요! – Basti

관련 문제