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

C# Discussion :

POO , Architecture et C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut POO , Architecture et C#
    J'ai besoin de conseils...


    J'ai trois classes :

    Tiers, PersonnesPhysiques, PersonnesMorales
    PersonnesPhysiques et PersonnesMorales héritent de Tiers ...logique ...

    En simplifié :
    Propriétes de tiers : IdTiers et NomTiers
    Propriétés de PersonnesPhysiques : IdPersonnesPhysiques; Prénom
    Propriétés de PersonnesMorales : IdPersonnesMorales; FormeJuridique

    D’un point de vue base de donnée (SQL serveur) j’ai trois tables du même nom, j’ai IdTiers comme clef étrangère dans PersonnesMorales et PersonnesPhysique ….Classique

    J’essaye de développer en couches …A savoir une couche métier() BLL et une couche d’accès aux données (DAL).

    J’ai mon Objet métier Tiers et mon Objet d’accès aux donnée TiersDAL . Dans mon objet TiersDAL j’ai une méthode :

    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
     
     public bool AjouterTiers(Tiers NewTiers)
            {
                try
                {
     
                        string SQL;
                        SQL = "INSERT INTO TIETiers ";
                        SQL += "(Nom, IdOperateur) ";
                        SQL += "Values(";
                        SQL += "'" + NewTiers.Nom.Replace("'", "''") + "'";
                        SQL += "," + NewTiers.IdOperateurTiers + "";
                        SQL += ")";
     
                        BaseDeDonnees.ExecuteRequete(SQL);
                        return true;
     
                }
                catch (Exception Erreur)
                {
                    throw Erreur;
                }
            }
    Dans ma table Tiers , IdTiers, qui est l’identifiant est un champ compteur à incrémentation automatique.

    Dans la même logique , J’ai un objet métier PersonnePhysique et mon Objet d’accès aux donnée PersonnePhysique DAL . Dans mon objet PersonnePhysiqueDAL j’ai une méthode :

    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
     
    public bool Ajouter PersonnePhysique ( PersonnePhysique New PersonnePhysique)
            {
                try
                {
     
                 string SQL;
                 SQL = "INSERT INTO TIEPersonnePhysique  ";
                 SQL += "(IdTiers, Prenom) ";
                 SQL += "Values(";
                 SQL += "'" + New PersonnePhysique.Prenom.Replace("'", "''") + "'";
                 SQL += "," + New PersonnePhysique.IdTiers + "";
                 SQL += ")";
     
                 BaseDeDonnees.ExecuteRequete(SQL);
                 return true;
     
                }
                catch (Exception Erreur)
                {
                    throw Erreur;
                }
            }
    Dans ma logique de base de données je dois en premier lieu créer un tiers , récupérer son identifiant pour le mettre dans l’enregistrement de la personne physique. Mon problème et que je ne sais pas comment organiser mes classes, mes méthodes et mes couches pour faire ceci ….

    Si un expert en la matière pouvait m’aider ..ce serrai tip top
    Merci d’avance

    Patrick

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    personnellement je n'utiliserai pas TiersDAL.
    J'utiliserai une Procédure Stockée AjoutPersonnePhysique (ou équivalent si tu n'utilises pas SQL Server) dans laquelle tu insères d'abord le Tiers, tu récupères l'Id et tu insères la personne physique, l'ensemble étant exécuté au sein d'une transaction.
    Cette procédure tu l'appelles dans la méthode AjoutPersonnePhysique de la DAL correspondante.

    Idem pour PersonneMorale.

    ++

  3. #3
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut ...
    Oui j'ai pensé à cette façon de faire ...mais je perd mon indépendance par rapport à la base de donnée ...mon appli n'est plus portable vers un autre type de Bd....

    mais je crois ue je vais être obligé d'y passer ...

    Si qqn à une autre solution je suis preneur ...

    Merci

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par PatStan17 Voir le message
    [...]
    Si qqn à une autre solution je suis preneur ...
    Quelle version de C# / du framework utilisez vous ?

  5. #5
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut Version
    framewok 3.5
    VS 2008 C#2008 92008-270-6062194-60553

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Un ORM comme Entity Framework ou NHibernate pourrait bien faciliter les choses

  7. #7
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut
    JE NE CONNAIS PAS DU TOUT ...lLfaut que je me documente ...je vais faire des recherches ...

    Merci

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Un ORM comme Entity Framework ou NHibernate pourrait bien faciliter les choses
    C'était le sens de ma question...

  9. #9
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Citation Envoyé par PatStan17 Voir le message
    Oui j'ai pensé à cette façon de faire ...mais je perd mon indépendance par rapport à la base de donnée ...mon appli n'est plus portable vers un autre type de Bd....
    C'est une utopie de croire que ton application (quelle qu'elle soit) est indépendante d'un SGBD.

    Si tu décidais de porter ton appli sur Oracle ou MySQL, tu serais de toutes façons obligé de réécrire tes scripts de création de base et de tables, ainsi que toutes tes requêtes qui manipulent des dates et des chaînes de caractères car les fonctions (conversion de formats, concaténations) ne sont pas les mêmes.

    Si tu pars from scratch, un bon schéma est d'écrire la BLL en C# et la DAL en procédures stockées SQL. Ca t'évitera de produire du code C# pour gérer tes Id incrémentaux et tes transactions.

  10. #10
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Hum... je me pose quand même une question... Ta classe Tiers ne devrait-elle pas être une classe abstraite ?

    Si c'est le cas, elle n'aura peut-être pas de représentation en base de données... et là, ça te simplifie grandement la tâche

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    C'est une utopie de croire que ton application (quelle qu'elle soit) est indépendante d'un SGBD.
    Non, ce n'est pas une utopie...Mais être complètement indépendant de la base de données demande effectivement des efforts conséquents et des sacrifices puisqu'il faut renoncer à certaines spécificités qui font justement la force de tel ou tel SGBD...

    Citation Envoyé par Gold Bug Voir le message
    Si c'est le cas, elle ne doit pas avoir de représentation en base de données... et là, ça te simplifie grandement la tâche
    Ah bon ????

    Tu énonces ça comme une règle; j'aimerais bien savoir sur quoi tu te bases...

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Salut,

    Pour commencer, quelques remarques :

    1. Evite ce genre de concaténation pour construire une requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string SQL;
    SQL = "INSERT INTO TIETiers ";
    SQL += "(Nom, IdOperateur) ";
    SQL += "Values(";
    SQL += "'" + NewTiers.Nom.Replace("'", "''") + "'";
    SQL += "," + NewTiers.IdOperateurTiers + "";
    SQL += ")";
    peut être avantageusement remplacé par l'usage de paramètres :

    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
     
     
    string sql = @"INSERT INTO TIETiers
                   (Nom, IdOperateur)
                   Values
                   (@Nom, @Id)";
     
    using (SqlConnection cn = new SqlConnection("dsn"))
    using (SqlCommand cmd = cn.CreateCommand())
    {
     cmd.CommandText = SQL;
     cmd.Parameters.Add("@Nom", SqlDbType.VarChar).Value = NewTiers.Nom;
     cmd.Parameters.Add("@Id", SqlDbType.Int).Value = NewTiers.IdOperateurTiers ;
     
     // Open cn and execute...
     
    }
    Evite aussi de faire un catch inutile comme là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    try
     {
     // ...  
     }
     catch (Exception Erreur)
     {
       throw Erreur;
     }
    Il ne sert strictement à rien de "catcher" une exception pour la relancer juste derrière en créant une nouvelle instance au passage...

    Maintenant, concernant ta question de base, il y a plusieurs stratégies possibles.

    Si tu veux continuer "à la main", tu pourrais faire quelque chose comme ça :

    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
     
    public abstract class TiersDAL
    {
     
     protected TiersDAL(DbTransaction tx) {}
     
     protected void Save(Tiers NewTiers)
     {
     // --> Execute SQL Statement (en utilisant la transaction) !!
     // --> Get Generated Id...
      NewTiers.IdOperateurTiers = generatedId;
     }
    }
     
    public class PersonnePhysiqueDAL : TiersDAL
    {
     public void Save(PersonnePhysique personne)
     {
      base.Save(personne);
      // --> Maintenant tu as l'Id généré...
      // --> SQL pour sauver les attributs de PersonnePhysique.
      // sans oublier d'utiliser la transaction !!
     }
     
    }
    Bon, l'exemple est schématique et simpliste, mais sur le principe c'est viable mais il faut s'assurer que tes objets DAL puissent se partager une transaction.

  13. #13
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    C'est juste pour permettre d'écrire une chaîne de caractère sur plusieurs ligne de ton GUI

  14. #14
    Membre éclairé Avatar de PatStan17
    Homme Profil pro
    Chef de projet / Développeur
    Inscrit en
    Décembre 2008
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2008
    Messages : 307
    Par défaut Bonne Année
    J'ai trouvé une solution qui me vas bien en utilisant @@Identity et Command.ExecuteScaler.


    Merci

    Patrick

  15. #15
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Par défaut
    Citation Envoyé par PatStan17 Voir le message
    J'ai trouvé une solution qui me vas bien en utilisant @@Identity et Command.ExecuteScaler.


    Merci

    Patrick
    sûr de ton @@identity??
    je dis pas que t'as tord mais regarde aussi

    SCOPE_IDENTITY()
    et IDENT_CURRENT

    ces trois choses font presque la même chose mais la nuance est suffisante pour que le mauvais choix te fasse planter ton appli

Discussions similaires

  1. Architecture de classe pour POO
    Par LegGohan dans le forum Langage
    Réponses: 7
    Dernier message: 09/11/2011, 10h28
  2. [POO] Questions sur mon architecture de boutique
    Par kro001 dans le forum Langage
    Réponses: 6
    Dernier message: 06/03/2009, 15h00
  3. [POO] Architecture
    Par bheero dans le forum Langage
    Réponses: 16
    Dernier message: 19/10/2008, 00h36
  4. [POO] [Architecture]... d'un site en php-objet ?
    Par Pill_S dans le forum Langage
    Réponses: 13
    Dernier message: 13/02/2006, 14h05
  5. architecture
    Par pons dans le forum CORBA
    Réponses: 3
    Dernier message: 11/06/2002, 11h10

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