Pergunta

Eu tenho um bastante grande aplicativo CRUD WinForm que tem vários objetos. Pessoa, inscrição, Plano, CaseNote etc . Há mais de 30 formas que compõem o aplicativo com a interface do usuário dividido logicamente. Membro, inscrições, Planos, CaseNotes, etc .

Eu estou tentando descobrir como eu posso criar a minha Pessoa Objeto depois de procurar no Formulário de Busca e passar o objeto para o próximo forma solicitada. Seja ele qual for, digamos Demografia . A curto do que é que eu preciso o objeto Pessoa para ser disponível em todo o App e só pode haver um.

Agora eu tenho ZERO exposição a Design Patterns mas estou tentando. Eu li http://www.switchonthecode.com/tutorials/csharp-tutorial -singleton-padrão e http://www.yoda.arachsys.com /csharp/singleton.html mas eu quero ter certeza que eu entendi como aplicar isso a minha situação.

Em primeiro lugar, o estado exemplos que você está acessando uma referência , correto? Estou enganado ou que eu preciso para acessar o valor ?

Em segundo lugar, é outra coisa lá qualquer coisa que eu preciso fazer para tornar esta disponível globalmente? Eu só declara uma instância em cada forma, mas através deste padrão Singleton, de modo a não ter mais de um?

Graças

EDIT 1

Para esclarecer, Todos os objetos são objetos filho de Pessoa. Além disso, como os ilude Pesquisa página para; os usuários podem selecionar um currentPerson diferente. Mas eles só podem interagir com ONE pessoa de cada vez.

Por último, como eu disse eu sou uma criança neste e se eu deveria estar a pensar em outra coisa, uma abordagem diferente por favor, diga e se você seria tão amável para oferecer alguma explicação sobre o porquê, eu estaria muito grato.

EDIT 2

Com base no comentário de Medicina Man Pensei que wauld esclarecer.

Em primeiro lugar, obrigado a todos os que contribuíram até agora. Em segundo lugar, eu não sei a primeira coisa sobre padrões de projeto e eu certamente não têm a menor ideia se um determinado um é necessário na minha situação atual.

Se alguém tem uma melhor, mais simples, ou, na sua opinião, um método mais montagem de passar um objeto de dados de forma em forma para formar então por favor dizer.

No final, eu só preciso de uma maneira de rastrear a informação como meus usuários ir de um lugar para outro. Obrigado


Foi útil?

Solução

Você pode usar o padrão Singleton para assegurar que apenas uma instância é já criado.

No entanto, o júri é ainda para fora (pelo menos na minha mente ) sobre se esta é uma boa decisão. Há uma abundância de leitura no SO e em outros lugares sobre isso.

Gostaria de abordar esta questão de um ângulo diferente. Eu faria tudo de meus formulários tomar uma instância de Pessoa no construtor. Dessa forma, cada forma é sempre apenas preocupado com a sua instância de Pessoa.

Você pode fazer isso através da criação de uma nova classe que herda de formulário e tem um campo / propriedade / construtor para sua pessoa. Então, qualquer forma que usa Pessoa pode herdar de sua nova classe.

Você poderia, é claro, tem que gerenciar a criação do seu objeto Person. Você pode até fazer isso com um singleton. No entanto, a vantagem é que cada forma não tem que saber como criar uma Pessoa ou que criou a Pessoa. Dessa forma, se você optar por afastamento da Singleton padrão , você não teria que ir mudar todas as suas referências à instância singleton.

EDIT:

Aqui está algum código para demonstrar isso. Levei um tempo para obter o designer para jogar bonito. Eu tive que adicionar um construtor privado vazio no PersonForm para obter o designer para não lançar um erro.

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 (adicionar uma etiqueta com o nome 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;
    }
}

Outras dicas

Em primeiro lugar, o estado exemplos que você está acessando uma referência, correto? Estou enganado ou que eu preciso para acessar o valor?

Sua classe que você está acessando é uma referência a uma única classe na memória. Por exemplo, digamos que sua classe é:

public class Person { ... }

Se você tem um singleton disso, você terá um único "Pessoa" salvos na memória, com uma referência compartilhada para que uma pessoa no singleton. Quando você acessar a sua única pessoa, você estará trabalhando com essa referência, que é provavelmente o que você quer. Quaisquer alterações à pessoa vai mudá-lo em todos os lugares.

Em segundo lugar, é outra coisa lá qualquer coisa que eu preciso fazer para tornar esta disponível globalmente? Eu só declara uma instância em cada forma, mas através deste padrão Singleton, de modo a não ter mais de um?

Singletons são usados ??para fazer cumprir, basicamente, que cada vez que você usar o objeto, é o mesmo objeto (cada uso é uma referência separada para a um, único objeto na memória). Você pode simplesmente pegar o singleton qualquer lugar que você precisar dele, e ele vai apenas trabalho.

Você poderia fazer algo parecido com isto:

public static class PersonController
{
    private static Person _Person;

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

        return _Person;
    }
}

Isso irá garantir que há apenas uma pessoa objeto. Você estará recebendo uma referência para o objeto _Person, não uma cópia, então qualquer mudança será o único objeto que você está esperando.

Como Reed diz, singletons impor que o mesmo objeto é usado em todo o aplicativo. No entanto, desde a sua pergunta não olha para mim como se você tem a mesma instância da classe pessoa disponível em todo o aplicativo, uma vez que não é o "formulário de busca" que parece que permite que você altere a pessoa selecionada.

Neste caso seu Singleton pode precisar de ser uma classe recipiente que contém o contexto atual do aplicativo e que a pessoa é atualmente selecionado. Isso pode ser algo como:

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

(Note que este não é um ideal singleton padrão, uma vez que não é thread-safe ...)

Em seguida, o formulário de busca iria definir a pessoa selecionada atualmente com:

Context.Instance.CurrentlySelectedPerson = personSelectedInForm;

E o grupo demográfico de pode usá-lo como:

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

Você também pode usar o padrão monostate com o seu Personclass.

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

Construir um objeto monostate para 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; }
    }
}

Agora você pode inicializar o monostate.

CurrentPerson.Person = GetPersonByUserInput();

E então CurrentPerson uso casos em todo o código e eles vão todos o acesso de um estado comum compartilhada.

CurrentPerson currentPerson = new CurrentPerson();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top