IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Comment disposer d'un objet "global"


Sujet :

Windows Forms

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 151
    Points : 7 399
    Points
    7 399
    Billets dans le blog
    1
    Par défaut Comment disposer d'un objet "global"
    Bonjour,

    Depuis toujours, je me pose la même question, en ce qui concerne les objets "globaux", à savoir par exemple un contexte, une connexion à la base de données, etc.

    J'ai une application avec plusieurs forms.
    Au démarrage, je crée un objet SqlConnexion.

    Comment faire pour l'avoir disponible "partout", à savoir :
    - dans toutes les forms
    - dans tous les controls des différentes forms

    Et ce, sans devoir me le trimbaler à la main dans tous les objets du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    frmClient fClient = new frmClient();
    fClient.cnx = this.cnx;
    C'est moche.

    A une époque, j'étais assez fan d'un système plus ou moins cousin au singleton : la classe statique avec constructeur : ça me permettait d'ouvrir la connection au premier appel, puis de l'avoir disponible partout.
    De mémoire ça ressemblait plus ou moins à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static class MyCnx
    {
       public static SqlConnexion cnx = new SqlConnexion(cnxstring);
     
       static MyCnx()
       {
          cnx.Open();
       }
    }
    Et ensuite, n'importe où dans le code, j'avais juste à faire "MyCnx.cnx" pour appeler ma connexion sans me soucier de où elle avait été ouverte ni par qui ni comment.

    Cependant, on m'a à l'époque déconseillé cette méthode.

    Quoi d'autre ?

    Je ne cherche pas à faire absolument un singleton. Je cherche avant tout à disposer d'une instance de mon objet partout sans devoir me trimbaler une référence dans tous mes objets.
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Tu vas me dire qu'il faudra aussi ajouter la référence, mais si tu crée un interface Model (Ou DataService, n'importe) et que tu l'utilises plutôt qu'utiliser directement SQLConnection ?

    Comme ça tu t'occupes de ta popote interne uniquement dans l'implémentation de cet interface.
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 151
    Points : 7 399
    Points
    7 399
    Billets dans le blog
    1
    Par défaut
    L'exemple avec le SqlConnection c'était juste pour illustrer.

    C'est bien une notion "d'objet global" que je recherche.

    J'ai relu un article qui compare la classe statique et le singleton, et même si j'ai pas tout compris l'intérêt du singleton (genre, on peut le passer en paramètre, osef, puisqu'on n'a plus besoin de le passer en paramètre...) je vais utiliser la solution du singleton.

    C'est surtout la phrase à propos de la classe statique "on sait pas du tout quand le constructeur est appelé, généralement avant le premier appel à une propriété".
    C'est le "généralement" qui me laisse perplexe. Si j'ai bien compris, ça peut vouloir dire que je peux parfois accéder à mon objet connexion sans que le constructeur (qui s'occupe de l'ouvrir) ait été appelé. Ça me fait un peu peur (même si j'ai jamais remarqué un tel comportement)
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Si j'ai bien compris, ça peut vouloir dire que je peux parfois accéder à mon objet connexion sans que le constructeur (qui s'occupe de l'ouvrir) ait été appelé.
    Non, pas de souci, l'objet sera déjà initialisé ou s'initialisera dès qu'on voudra y accéder.

    Toutefois, en ce qui me concerne, je préfére définir une classe normale avec une variable public static contenant l' instance de la classe que l'on va partager et je créée cette instance explicitement au début du programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MyCnx.SharedCnx = new Mycnx(TheConnectionString) ;
    ...
    frmClient fClient = new frmClient();
    fClient.cnx = MyCnx.SharedCnx;
    ...
    public class MyCnx
    {
       public static SharedCnx  = null ;
       private SqlConnexion cnx = null ;
       public MyCnx(string cnxstring){ cnx = new SqlConnexion(cnxstring); cnx.Open(); }
    }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. [cr 8.5] comment exploiter les données d'un "array"
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 09/06/2005, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo