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

ASP.NET Discussion :

instanciation d'une classe d'acces aux données


Sujet :

ASP.NET

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut instanciation d'une classe d'acces aux données
    Bonjour, j'ai une classe DataAccess qui comprends plusieur méthode pour créer une connexion, executer des requetes, etc...

    Dans mes pages aspx, je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public partial class Accueil : PageCulture
    {
        DataAcces myFac = new DataAcces();
     
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
    }
    J'instancie avant le page load. Ma question est la suivante, est ce une bonne méthode. Ou bien dois-je instancier la classe seulement lorsque j'en ai besoin.
    Dans mon cas, je l'a déclare 1 seule fois dans la page (avant le page_load), et j'utilise le meme objet "myFac".

    Merci pour votre réponse

  2. #2
    Rédacteur
    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    Ben on extensie un objet lorsque l'on doit l'utiliser pas par simple plaisir

  3. #3
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Sinon utilise des class static, tu feras par consequent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DAL.CreateConnection();

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    pour les classes statiques j'ai déjà des trucs qui fonctionnent. Mais là c'est vrai que l'objet peut etre instancier 1 fois et être utilisé pour plusieur méthodes.
    Je sais bien on utilise un objet quand on en a besoin, mais pour réutiliser l'objet ou pour ecrire moins de code, c'est sur que c'est mieux

  5. #5
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Alors je n'ai pas entierement compris ta question

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Actuellement.J'ai une classe d'acces aux données DataAcces.

    Ensuite dans le code-behind de ma page au tout début avant le page_load, je fais DataAcces myFac = new DataAcces() et j'utilise l'objet myFac dans les n méthodes qui sont définis dans ma page.

    La question que je pose c'est est ce que je peux faire cela comme ça. Ou bien dans chacune de mes fonctions ou j'ai besoin de faire un acces à ma classe faire ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataAcces myFac = new DataAcces() ;
    Comprends-tu mieux?

  7. #7
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Pourquoi ne passe tu pas par un accesseur qui creeras ton objet en dynamique quand il est utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public DAC MonDAC 
    {
          if (monconteneur["MonDAC "]==null)
             monconteneur["MonDAC "]= new DAC();
          return (DAC )monconteneur["MonDAC "];
    }
    Ainsi peu importe de savoir quel est son état , quand tu l'appeleras tu l'auras.

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    ok, je vais voir ce que je peux faire.
    Merci

  9. #9
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    J'ai aussi un objet de ce type.

    Il y a une chose importante à retenir: une classe qui utilise des objets disposables doit elle-même être disposable.

    Le code ci-dessous ne respecte pas cette bonne pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class DataAcces
    {
        private IDbConnection cn;
     
        public IDbConnection Connexion
        {
            get { return cn; }
            set { cn = value; }
        }
     
        public DataAcces()
        {
            this.Connexion = new SqlConnection();
            this.Connexion.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            this.Connexion.Open();
        }
    }
    Le bon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class DataAcces : IDisposable
    {
        private IDbConnection cn;
        private bool _disposed = false;
     
        public IDbConnection Connexion
        {
            get { return cn; }
            set { cn = value; }
        }
     
        public DataAcces()
        {
            this.Connexion = new SqlConnection();
            this.Connexion.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            this.Connexion.Open();
        }
     
        #region IDisposable Members
     
        public void Dispose()
        {
            // Check if Dispose has already been called 
            if (!_disposed)
            {
                // Call the overridden Dispose method that contains common cleanup code
                // Pass true to indicate that it is called from Dispose
                Dispose(true);
                // Prevent subsequent finalization of this object. This is not needed 
                // because managed and unmanaged resources have been explicitly released
                GC.SuppressFinalize(this);
                _disposed = true;
            }
        }
     
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (this.Connexion != null)
                {
                    if (this.Connexion.State == ConnectionState.Open)
                    {
                        this.Connexion.Close();
                    }
                    this.Connexion.Dispose();
                    this.Connexion = null;
                }
            }
        }
     
        /// <summary>
        /// Implement a finalizer by using destructor style syntax
        /// </summary>
        ~DataAcces()
        {
            // Call the overridden Dispose method that contains common cleanup code
            // Pass false to indicate the it is not called from Dispose
            Dispose(false);
        }
        #endregion
    }
    Il faut respecter ce schéma et détruire tous les objets non gérés dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void Dispose(bool disposing)
    Son utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Program
    {
        public static void Main(string[] args)
        {
            using (DataAcces da = new DataAcces())
            {
                // Ton code pour récupérer les données
            }
        }
    }
    Tu peux ainsi faire appel à un block "using" dans lequel les variables déclarées n'ont pas de portée en-dehors du block. C'est plus propre.

    Finalement, que tu créés une instance à la demande ou bien une instance pour toute ta classe n'a pas énormement d'importance. En pratique, créer des instances à la volées doit prendre un peu de ressources créer/détruire, aller chercher une connexion dans le pool... Il faut aussi savoir que si tu as besoin d'une deuxième connexion (requêtes imbriquées) il te faudra une nouvelle instance.

    Personnellement, mes objets qui font appel à DataAccess ont chacun une seule instance qui dure tant que l'objet n'est pas détruit. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    public class MonProvider : IDisposable
    {
        private DataAcces da = null;
        private bool _disposed = false;
     
        public MonProvider()
        {
            da = new DataAcces();
        }
     
        public object Load(int id)
        {
            object obj = new object();
            // Mon code pour récupérer les donnée en fonction de mon id
            return obj;
        }
     
        #region IDisposable Members
     
        public void Dispose()
        {
            // Check if Dispose has already been called 
            if (!_disposed)
            {
                // Call the overridden Dispose method that contains common cleanup code
                // Pass true to indicate that it is called from Dispose
                Dispose(true);
                // Prevent subsequent finalization of this object. This is not needed 
                // because managed and unmanaged resources have been explicitly released
                GC.SuppressFinalize(this);
                _disposed = true;
            }
        }
     
        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                da.Dispose();
            }
        }
     
        /// <summary>
        /// Implement a finalizer by using destructor style syntax
        /// </summary>
        ~MonProvider()
        {
            // Call the overridden Dispose method that contains common cleanup code
            // Pass false to indicate the it is not called from Dispose
            Dispose(false);
        }
        #endregion
     
    }
    Petite remarque, un objet d'accès aux données ne devrait pas apparaître dans une IHM.

    A+

  10. #10
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    tout à fait d'Accord avec immobilis. Mais si tu utilises le petit bout de code que je t'ai mis plus haut, tu n'as plus qu a l'integrer dans ta page PageCulture par exemple et dans l'evenement onUnload tu pourras fermer cette connection si elle est ouverte.

    C'est un petit truc sympa et rapide a faire pour gerer sa connection. Maintenant, tout ce qu'a dis Immobilis est mieux, mais fais selon tes possibilites pour le moment...

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    Merci beaucoup pour vos réponses, je vais voir comment je peux continuer et au pire je ne pourrais faire que mieux la prochaine fois.

  12. #12
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    N'hésites pas à marquer comme résolue tes questions.


    à bientôt,

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Points : 707
    Points
    707
    Par défaut
    c'est vrai.dsl

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/08/2012, 22h05
  2. Création d'une classe d'accès aux données
    Par PlayerOne dans le forum Accès aux données
    Réponses: 15
    Dernier message: 15/09/2009, 13h24
  3. [Debutant] Classe d'acces aux données
    Par Keldrhyn dans le forum Access
    Réponses: 4
    Dernier message: 18/02/2007, 21h30
  4. Réponses: 5
    Dernier message: 25/05/2006, 00h53
  5. Réponses: 13
    Dernier message: 23/02/2006, 12h42

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