MonoState, 싱글톤 또는 파생 양식:CRUD 앱에 대한 최선의 접근 방식은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/825617

문제

수많은 개체가 포함된 상당히 큰 CRUD WinForm 앱이 있습니다. 개인, 등록, 계획, CaseNote 등.논리적으로 분류된 UI를 사용하여 앱을 구성하는 30개 이상의 양식이 있습니다. 회원, 등록, 계획, CaseNotes 등.

어떻게 생성할 수 있는지 알아내려고 노력 중입니다. 사람 객체 에서 검색한 후 검색 양식 그리고 해당 개체를 다음 요청 양식에 전달합니다.그게 뭐든지 말해 보자. 인구통계.단점은 앱 전체에서 Person 개체를 사용할 수 있어야 하며 하나만 있을 수 있다는 것입니다.

이제 저는 디자인 패턴에 전혀 노출되지 않았지만 노력하고 있습니다.내가 읽고 http://www.switchonthecode.com/tutorials/csharp-tutorial-singleton-pattern 그리고 http://www.yoda.arachsys.com/csharp/singleton.html 하지만 나는 이것을 내 상황에 적용하는 방법을 올바르게 이해하고 있는지 확인하고 싶습니다.

첫째, 예제에서는 귀하가 참조, 옳은?제가 착각한 걸까요, 아니면 액세스해야 합니까? ?

둘째, 이 제품을 전 세계적으로 사용할 수 있도록 하기 위해 수행해야 할 다른 작업이 있습니까?각 양식에 인스턴스를 선언하되 이 싱글톤 패턴을 통해 하나 이상을 가지지 않도록 합니까?

감사해요

편집 1

명확히 하기 위해 모든 객체는 Person의 하위 객체입니다.또한, 검색 페이지가 빠져나가듯이;사용자는 다른 currentPerson을 선택할 수 있습니다.하지만 그들은 오직 상호작용만 할 수 있습니다. 하나 한 번에 사람.

마지막으로, 제가 말했듯이 저는 이 분야에서 유아입니다. 만약 제가 다른 것을 고려하고 있다면 다른 접근법을 고려하고 있다면 그렇게 말씀해 주시고 그 이유에 대해 친절하게 설명해 주시면 매우 감사하겠습니다.

편집 2

Medicine Man의 의견을 바탕으로 나는 명확히 해야 한다고 생각했습니다.

먼저, 지금까지 기여해주신 모든 분들께 감사드립니다.둘째, 나는 디자인 패턴에 대해 아무것도 모르고 현재 상황에서 특정 패턴이 필요한지 확실하게 알지 못합니다.

누군가가 FORM에서 FORM, FORM으로 데이터 개체를 전달하는 더 좋고 간단하거나 더 적합한 방법을 가지고 있다면 알려주시기 바랍니다.

결국에는 사용자가 이곳저곳 이동할 때 정보를 추적할 수 있는 방법이 필요합니다.감사합니다


도움이 되었습니까?

해결책

싱글톤 패턴을 사용하면 단 하나의 인스턴스만 생성되도록 할 수 있습니다.

하지만, 배심원은 아직 나오지 않았어 (적어도 내 마음으로는) 이것이 좋은 결정인지에 대해.SO 및 이에 대한 다른 장소에 대한 많은 독서가 있습니다.

나는 이것을 다른 각도에서 접근할 것이다.나는 모든 양식이 생성자의 Person 인스턴스를 사용하도록 만들 것입니다.이렇게 하면 각 양식은 해당 Person 인스턴스에 대해서만 걱정합니다.

Form에서 상속되고 Person에 대한 필드/속성/생성자를 포함하는 새 클래스를 생성하면 이를 수행할 수 있습니다.그러면 Person을 사용하는 모든 양식이 새 클래스에서 상속될 수 있습니다.

물론 Person 객체의 생성을 관리해야 합니다.싱글톤으로도 이 작업을 수행할 수 있습니다.그러나 이점은 각 양식에서 Person을 만드는 방법이나 Person을 만든 사람을 알 필요가 없다는 것입니다.그렇게 해서 선택하면 싱글턴 패턴에서 벗어나다, 싱글톤 인스턴스에 대한 모든 참조를 변경할 필요가 없습니다.

편집하다:

이를 보여주는 몇 가지 코드가 있습니다.디자이너가 좋은 플레이를 하게 만드는 데 시간이 좀 걸렸습니다.디자이너가 오류를 발생시키지 않도록 하려면 PersonForm에 빈 개인 생성자를 추가해야 했습니다.

Program.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!" }));
        }
    }

Person.cs

public class Person
{
    public virtual string Name { get; set; }
}

PersonForm.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;
    }
}

다른 팁

먼저, 예제는 참조에 액세스하고 있다고 말합니다. 맞습니까? 내가 착각 했습니까 아니면 가치에 액세스해야합니까?

귀하가 액세스하는 수업은 메모리의 단일 클래스에 대한 참조입니다. 예를 들어, 수업은 다음과 같습니다.

public class Person { ... }

그 싱글 톤이 있다면, 단일 "사람"이 기억에 저장되며, 싱글 톤의 한 사람에 대한 공유 참조가 있습니다. 한 사람에게 접근 할 때, 당신은 아마도 당신이 원하는 것일 것입니다. 사람에 대한 모든 변경 사항은 어디에서나 변경합니다.

둘째, 이것을 전 세계적으로 이용할 수 있도록해야 할 다른 일이 있습니까? 각 양식에서 인스턴스를 선언하지만이 싱글 톤 패턴을 통해 하나 이상을 갖지 않도록?

싱글 톤은 기본적으로 객체를 사용할 때마다 동일한 객체임을 시행하는 데 사용됩니다 (각 사용은 메모리의 단일 객체에 대한 별도의 참조입니다). 당신은 당신이 필요로하는 어느 곳에서나 싱글 톤을 잡을 수 있으며, 그것은 단지 작동합니다.

당신은 다음과 같은 일을 할 수 있습니다 :

public static class PersonController
{
    private static Person _Person;

    public static Person GetPerson()
    {
        if (_Person == null)
            _Person = new Person();

        return _Person;
    }
}

이렇게하면 한 사람의 객체 만 있으면됩니다. 사본이 아닌 _person 객체에 대한 참조를 얻을 수 있으므로 기대하는 단일 객체에 대한 변경 사항이 변경됩니다.

Reed가 말했듯이 Singletons는 응용 프로그램 전체에서 동일한 객체가 사용된다고 강요합니다. 그러나 귀하의 질문에서 귀하가 전체 응용 프로그램 전체에서 사용할 수있는 사람 클래스의 인스턴스를 가지고있는 것처럼 보이지 않습니다. "검색 양식"이 있으므로 현재 선택한 사람을 변경할 수있는 것처럼 보입니다.

이 경우 싱글 톤은 신청서의 현재 컨텍스트를 보유하는 컨테이너 클래스 여야하고 어떤 사람이든 현재 선택된. 이것은 다음과 같습니다.

public class Context
{
   private static Context _instance;

   public static Context Instance
   {
       get
       {
           if (_instance == null)
           {
               _instance = new Context();
           }
           return _instance;
       }
   }

   public Person CurrentlySelectedPerson { get; set; }

   private Context() { }
}

(스레드 안전하지 않기 때문에 이것은 이상적인 싱글 톤 패턴이 아닙니다 ...)

그런 다음 검색 양식은 현재 선택된 사람을 다음과 같이 설정합니다.

Context.Instance.CurrentlySelectedPerson = personSelectedInForm;

인구 통계는 다음과 같이 사용할 수 있습니다.

//Get the demographics for the current person
ShowDemographics(Context.Instance.CurrentlySelectedPerson);

당신은 또한 당신과 함께 모노 스테이트 패턴을 사용할 수도 있습니다 Person수업.

public class Person
{
    public Guid Id { get; set; }
    public String FirstName { get; set; }
    public String LastName { get; set; }
}

모성 대상을 구축하십시오 Person.

public class CurrentPerson
{
    public static Person Person { get; set; }

    public Guid Id
    {
        get { return CurrentPerson.Person.Id; }
        set { CurrentPerson.Person.Id = value; }
    }

    public String FirstName
    {
        get { return CurrentPerson.Person.FirstName; }
        set { CurrentPerson.Person.FirstName = value; }
    }

    public String LastName
    {
        get { return CurrentPerson.Person.LastName; }
        set { CurrentPerson.Person.LastName = value; }
    }
}

이제 모노 스테이트를 초기화 할 수 있습니다.

CurrentPerson.Person = GetPersonByUserInput();

그리고 사용하십시오 CurrentPerson 코드 전체의 인스턴스 및 공통 공유 상태에 모두 액세스 할 수 있습니다.

CurrentPerson currentPerson = new CurrentPerson();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top