Question

J'ai une application CRUD WinForm assez grande qui comporte de nombreux objets. Personne, Inscription, Plan, CaseNote, etc. . Il existe plus de 30 formulaires qui composent l'application avec une interface utilisateur décomposée de manière logique. Membre, inscriptions, régimes, notes de cas, etc. .

J'essaie de trouver un moyen de créer mon objet Personne après une recherche dans le formulaire de recherche et de transmettre l'objet à l'objet suivant. formulaire demandé. Quoi qu’il en soit, disons Données démographiques . En résumé, j’ai besoin que l’objet Personne soit disponible dans l’application et qu’il ne puisse en exister qu’une.

Maintenant, je n’ai aucune exposition aux motifs de conception, mais j’essaie. J'ai lu http://www.switchonthecode.com/tutorials/csharp-tutorial -singleton-pattern et http://www.yoda.arachsys.com /csharp/singleton.html , mais je veux m'assurer de bien comprendre comment appliquer cela à ma situation.

Premièrement, les exemples indiquent que vous accédez à une référence , n'est-ce pas? Est-ce que je me trompe ou aurais-je besoin d'accéder à la valeur ?

Deuxièmement, y a-t-il autre chose que je dois faire pour rendre ce document disponible à l'échelle mondiale? Dois-je simplement déclarer une instance sur chaque formulaire, mais par le biais de ce modèle Singleton, afin de ne pas en avoir plus d'un?

Merci

EDIT 1

Pour clarifier, tous les objets sont des objets enfants de Person. Aussi, comme la page de recherche élude à; les utilisateurs peuvent sélectionner un autre utilisateur actuel. Mais ils ne peuvent interagir qu'avec une UNE personne à la fois.

Enfin, comme je l’ai dit, je suis un enfant dans ce domaine et si je devais envisager autre chose, une approche différente, dites-le-moi. Si vous pouviez bien vouloir expliquer pourquoi, je le ferais. très reconnaissant.

EDIT 2

D'après le commentaire de Medicine Man, je pensais que je devais préciser.

Tout d'abord, merci à tous ceux qui ont contribué jusqu'à présent. Deuxièmement, je ne connais pas la première chose à propos des modèles de conception et je n’ai certainement pas la moindre idée de ce qui est nécessaire si un tel modèle est nécessaire dans ma situation actuelle.

Si quelqu'un a une méthode meilleure, plus simple ou, à votre avis, plus appropriée pour passer un objet de données de FORM à FORM à FORM, alors, MERCI de le dire.

À la fin, j’ai juste besoin d’un moyen de suivre les informations, car mes utilisateurs se déplacent d’un lieu à l’autre. Merci

Était-ce utile?

La solution

Vous pouvez utiliser le modèle Singleton pour vous assurer qu'une seule instance est créée.

Cependant, le jury n'est pas encore sorti (du moins dans mon esprit ) s'il s'agit d'une bonne décision. Il y a beaucoup de lecture sur SO et d'autres endroits à ce sujet.

Je voudrais aborder cela sous un angle différent. Je ferais en sorte que toutes mes formes prennent une instance de personne dans le constructeur. De cette façon, chaque formulaire est uniquement préoccupé par son exemple de personne.

Vous pouvez le faire en créant une nouvelle classe qui hérite de Form et a un champ / propriété / constructeur pour votre personne. Ensuite, tout formulaire utilisant Person peut hériter de votre nouvelle classe.

Vous devrez bien sûr gérer la création de votre objet Personne. Vous pouvez même faire cela avec un singleton. Toutefois, l'avantage est que chaque formulaire n'a pas à savoir comment créer une personne ou qui l'a créée. De cette façon, si vous choisissez de vous éloigner du Singleton motif , vous n’auriez pas à changer toutes vos références à votre instance singleton.

EDIT:

Voici un code pour illustrer cela. Il m'a fallu un certain temps pour que le designer joue bien. J'ai dû ajouter un constructeur privé vide dans PersonForm pour que le concepteur ne génère pas d'erreur.

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 (ajouter une étiquette nommée 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;
    }
}

Autres conseils

  

Premièrement, les exemples indiquent que vous accédez à une référence, n'est-ce pas? Est-ce que je me trompe ou aurais-je besoin d'accéder à la valeur?

La classe à laquelle vous accédez est une référence à une seule classe en mémoire. Par exemple, supposons que votre classe soit:

public class Person { ... }

Si vous avez un singleton de cela, vous aurez un seul " Personne " enregistré dans la mémoire, avec une référence partagée à cette personne dans le singleton. Lorsque vous accédez à votre personne seule, vous travaillez avec cette référence, ce qui est probablement ce que vous voulez. Toute modification apportée à la personne la changera partout.

  

Deuxièmement, y a-t-il autre chose que je dois faire pour rendre ce document disponible à l'échelle mondiale? Dois-je simplement déclarer une instance sur chaque formulaire, mais par le biais de ce modèle Singleton, afin de ne pas en avoir plus d'un?

Les singletons sont utilisés pour appliquer fondamentalement le fait que chaque fois que vous utilisez l'objet, il s'agit du même objet (chaque utilisation est une référence distincte à l'objet unique en mémoire). Vous pouvez simplement attraper le singleton où vous en avez besoin, et cela fonctionnera.

Vous pouvez faire quelque chose comme ceci:

public static class PersonController
{
    private static Person _Person;

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

        return _Person;
    }
}

Cela garantira qu’il n’ya qu’un seul objet personne. Vous obtiendrez une référence à l'objet _Person, pas une copie, de sorte que les modifications seront apportées à l'objet unique que vous attendez.

Comme le dit Reed, les singletons imposent que le même objet soit utilisé dans toute l'application. Cependant, d'après votre question, il ne me semble pas que vous ayez la même instance de la classe de personnes disponible dans toute l'application, car il existe le "formulaire de recherche". qui semble vous permettre de changer la personne actuellement sélectionnée.

Dans ce cas, il peut être nécessaire que votre singleton soit une classe de conteneur contenant le contexte actuel de l'application et la personne actuellement sélectionnée. Cela peut être quelque chose comme:

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

(Notez que ce n'est pas un modèle de singleton idéal, car il n'est pas thread-safe ...)

Ensuite, le formulaire de recherche définira la personne actuellement sélectionnée avec:

Context.Instance.CurrentlySelectedPerson = personSelectedInForm;

Et le groupe démographique de peut l’utiliser comme:

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

Vous pouvez également utiliser le modèle monostate avec votre classe Personne .

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

Construire un objet monostate pour Personne .

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

Vous pouvez maintenant initialiser le monostat.

CurrentPerson.Person = GetPersonByUserInput();

Utilisez ensuite les instances CurrentPerson dans tout le code pour accéder à un état partagé commun.

CurrentPerson currentPerson = new CurrentPerson();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top