none
Architecture 3 tiers: DAL et bonnes pratiques

    Discussion générale

  • Bonjour à tous,

    dans mon nouveau projet, j'ai opté pour une fois pour une architecture 3 tiers. Par contre je me pose des questions sur la partie Base de données.

    Je cherche la meilleure structure pour cette classe.

    Est-ce qu'il serait cohérent d'écrire ceci?

    Classe MainDAL{
    
      private static MySqlConnection _myCnx;
      private string _cnxString;
      private String _db_host;
      private String _db_pass;
      private String _db_user;
      private String _db_name;
    
      public MainDal(){
        _db_host=......
        _cnxString=....
        ....
        _myCnx = new MysqlConnection(_cnxString);
      }
    
      private static void openCnx(){
        if(_myCnx != null){
            _myCnx.Open();
            return true;
        }else{
            return false;
        }
      }
    
      private static void closeCnx(){
        if(_myCnx != null){
            _myCnx.Close();
            return true
        }else{
            return false;
        }
      }
    
      public List<String> getList(){
        if(MainDAL.openCnx() == true){
            //ma requete à lancer
    	myReq = "SELECT .....";
    	myCmd = new MySqlCommand(myReq,_myCnx);
    	myReader = myCmd.ExecuteReader();
    	while(myReader.Read()){
    	}
        }
      }
    
      public void validItem(){
      }
    }

    Faut il zapper les deux méthodes statiques (openCnx et closeCnx) et intégrer directement dans les méthodes qui exécuteront des requètes sql?

    Comment optimiser cette partie? j'ai vu pas mal de choses sur le net mais je suis un peu perdu. Faut il partir sur un pattern Singleton?

    Je vous remercie d'avance pour vos bons conseils.

        if(MainDAL.openCnx() == true){
            //ma requete à lancer
        }

    dimanche 5 février 2017 18:40

Toutes les réponses

  • Bonjour,
    Quel type d'application développez-vous?

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 6 février 2017 15:33
    Modérateur
  • un systeme de news pour les utilisateurs de mon parc info
    lundi 6 février 2017 19:47
  • Bonjour,

    Surtout, ne pas faire comme ça ;-)

    La classe doit être autonome ou au pire implémenter IDisposable pour indiquer au code client qu'il faut fermer la connexion.

    La bonne pratique est d'utiliser les ressources extérieures de façon optimum, le moins possible.

    Donc il faut créer, ouvrir, utiliser, fermer la connexion dans la méthode, avec un using par exemple :

    using (var conn = new MySqlConnexion(...))
    {
        using(var comm = new MySqlCommand(SQLRequest, conn))
        {
            comm.Parameters.AddWithValue(....);
            conn.Open();
            // reader ou executeScalar ou ExecuteNonQuery
            conn.Close(); // pas indispensable car dispose le fait aussi
        }
    }


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mardi 7 février 2017 08:19
  • Bonjour,

    Surtout, ne pas faire comme ça ;-)

    La classe doit être autonome ou au pire implémenter IDisposable pour indiquer au code client qu'il faut fermer la connexion.

    Merci pour l'intervention.

    Le truc c'est que aujourd'hui je suis sur MySql mais  prochainement je devrais changer de SGBD donc à ce moment là il faudra que j'intervienne à plusieurs endroits dans le code alors que si je centralise ça dans une seule classe, le changement se fera plus aisément.

    Comment  adapter à mes besoins? en créant une classe indépendant et en instanciant un objet mysqlConnection? je cherchais également à n'instancier qu'une seule fois cet objet et le réutiliser en cas de besoin.

    edit: en même temps j'ai aussi l'execution de mes requetes qu'il faudra adapter le jour ou je change de sgbd. il est peut être conseillé d'inclure une methode query dans ma classe mysql?
    • Modifié kstou mardi 7 février 2017 20:46
    mardi 7 février 2017 20:22