none
Structure 3-tiers et nom des champs de la base de données. RRS feed

  • Question

  • Il y a 2 ans j'ai commencé à développer une application c# winforms pour mon entreprise. Je me suis basé sur un modèle 3-tiers que j'avais trouvé sur CodeProject.

    En gros la structure ressemble à ça    UI ---> BAL (BLL & BO) --> DAL   (DAL ne connaît pas BAL et BAL ne connaît pas UI)

    La mise en place de l'application était urgente j'ai donc fait ce qui était nécessaire pour qu'ils puissent travailler et ça fonctionne parfaitement. 
    Le DAL travaille avec un serveur SQL 2008 interne à l'entreprise.

    Toutefois en revenant sur mes codes j'aimerais changer certaines choses dans l'accès au données pour les améliorer et utiliser les méthodes 'recommandées'
    Je donne ici un exemple très simplifié pour expliquer ma situation : 

    Dans ma DB j'ai une table 'companies' avec 4 champs

    • co_id (PK, int)
    • co_text (varchar, 100)
    • co_phone (varchar, 30)
    • co_email (varchar, 50)

    Je définis 2 classes pour le BAL :

    la classe BO.Company

        public class Company : BO__object
        {
            public int Id { get; set; }
            public string Text { get; set; }
            public string Phone { get; set; }
            public string EMail { get; set; }
    
            public Company()
            {
                Id = 0;
                Text = "";
                Phone = "";
                EMail = "";
            }
    
            public Company(DataRow row)
            {
                Id = (int)row["co_id"];
                Text = (string)row["co_text"];
                Phone = (string)row["co_phone"];
                EMail= (string)row["co_email"];
            }
        }


    Puis la classe BLL.Company

    public class Company : BLL
    {
        protected DAL.Company DAL = new DAL.Company();
    
        public BO.Company DataGet(int id)
        {
            DataTable dt = DataGet(DAL.Table, DAL.IdField, id);
            BO.Company bc = new BO.Company();
            if (dt.Rows.Count > 0) bc = new BO.Company(dt.Rows[0]);
            return bc;
        }
    
        public int Save(DO.DataAction dataAction, BO.Company cmp, CompanyValidation cv = CompanyValidation.OK)
        {
            int newRecordId = 0;
            if (cv == CompanyValidation.OK)
                newRecordId = DAL.Save(cmp.Id, cmp.Name, cmp.Phone, cmp.EMail, dataAction, cmp.Id);
            return newRecordId;
        }
    }

    C'est super simplifié donc... :-)

    Pour ajouter un text au nom de la company qui à l'ID 34 je fais

    BLL.Company bllcmp = new BLL.Company())
    BO.Company cmp = DataGet(34)
    cmp.Text += " - Hello world!"
    bllcmp.Save(DataAction.ActionInsert, cmp, CompanyValidation.OK)

    le bllcmp.Save va lancer le DAL.Save qui lui même va préparer des paramètres pour une Stored procedure et l'exécuter avec ces paramètres.
    La procédure stockée va faire un UPDATE ou un INSERT en fonction du DataAction
    le DALCompany est une classe basée sur le DAL qui ouvre une connexion avec le serveur et exécute les actions avec le serveur SQL

    Un DAL se définit ainsi :

    public class Company : DAL
    {
        public Company()
        {
            Table = "company";
            IdField = "cm_id";
            StoredProcedure = "prccompany_change";
        }
        //...
    }
    
    

    Voilà mon problème.

    • Dans le DAL j'indique le nom de la Table, la clé primaire et la StoredProcedure à utiliser.
    • Dans le BO j'utilise également les noms de champs pour instancier une companie à partir d'une DataRow
    • N'est-ce pas le DAL qui devrait gérer intégralement tout ce qui touche aux noms des champs / tables / ... ?
    • Comment écrire le méthode public Company(DataRow row) en utilisant une structure provenant du DAL ?

    Devrais-je décrire un DAL Static pour chacune de mes tables qui définit exactement la structure d'une table et gérer les opérations de maintenances sur une table ?
    Devrais-je inverser la vapeur ?
    Je ne sais pas si ma question est suffisamment claire, merci pour votre aide !

    Florent

    mardi 25 septembre 2012 23:10

Réponses

  • Alors je vous conseille donc de voir du côté d'Entity Framework. En plus de la possibilité de faire du Database First si vous avez déjà une base de données existante et que vous voulez l'utiliser et du Code First qui offre aussi en plus de partir de rien, la possiblité de se baser sur une base existante. vous pouvez aussi faire du Model First. Après tout, tout répondra de votre besoin. Mais si vous voulez utiliser seulement du code, Je vous conseille le Code First.

    voilà un lien très bien détaillé à propos de l'utilisation d'Entity Framework: http://msdn.microsoft.com/fr-FR/data/ee712907

    Cordialement,


    Blog: marouene.slimi.net

    • Marqué comme réponse Alfred Wallac3 mercredi 26 septembre 2012 16:06
    mercredi 26 septembre 2012 15:41

Toutes les réponses

  • Bonjour,

    Le fait que vous interagissez directement avec la bases de données et en n'utilisant que les procédures stockées c'est un choix ?

    Car vous pouvez utiliser l'ORM Entity Framework qui ajoute une couche d'abstraction entre votre base de données et votre application et vous pouvez ainsi manipuler exclusivement des objets.

    Cordialement,


    Blog: marouene.slimi.net

    • Proposé comme réponse Lyamine mercredi 26 septembre 2012 14:54
    mercredi 26 septembre 2012 14:28
  • Bonjour,

    Le fait que vous interagissez directement avec la bases de données et en n'utilisant que les procédures stockées c'est un choix ?

    Car vous pouvez utiliser l'ORM Entity Framework qui ajoute une couche d'abstraction entre votre base de données et votre application et vous pouvez ainsi manipuler exclusivement des objets.

    Cordialement,


    Blog: marouene.slimi.net

    Hello,
    Pour les procédures stockées ça n'est pas vraiment un choix je devais faire un système qui utilisait SQL mais lorsque j'ai commencé je ne connaissais ni .NET, ni C#, ni SQL donc je me suis inspiré d'exemples trouvés sur le net. Il est clair que je ne vois pour l'instant aucunement l'intérêt des procédures stockées dans mon application.

    Je ne connais pas Entity Framework mais ça à bien l'air de ce que j'ai besoin, afin de ne plus que travailler avec des objets c'est bien ça ?

    Merci pour votre réponse.


    mercredi 26 septembre 2012 14:58
  • Bonjour,

      Oui c'est bien cela grace à Entity Framework vous pourrez travailler avec des objets pour requeter sur votre base de données.

      Suivant vos besoins vous pourrez générer vos objets à partir d'une base de données (Database-First), ou générer la base de données à partir de vos objets (Code-First)

    Cordialement,

    mercredi 26 septembre 2012 15:07
  • Alors je vous conseille donc de voir du côté d'Entity Framework. En plus de la possibilité de faire du Database First si vous avez déjà une base de données existante et que vous voulez l'utiliser et du Code First qui offre aussi en plus de partir de rien, la possiblité de se baser sur une base existante. vous pouvez aussi faire du Model First. Après tout, tout répondra de votre besoin. Mais si vous voulez utiliser seulement du code, Je vous conseille le Code First.

    voilà un lien très bien détaillé à propos de l'utilisation d'Entity Framework: http://msdn.microsoft.com/fr-FR/data/ee712907

    Cordialement,


    Blog: marouene.slimi.net

    • Marqué comme réponse Alfred Wallac3 mercredi 26 septembre 2012 16:06
    mercredi 26 septembre 2012 15:41
  • Merci énormément pour votre aide je viens de lire quelques documents sur Entity Framework

    Si seulement je l'avais découvert avant !

    Mais il n'est jamais trop tard pour progresser.

    Merci encore et bonne journée à tous.

    mercredi 26 septembre 2012 16:07
  • Je vous en prie :) c'est clair que quelque soit notre niveau,  nous aurons toujours de nouvelles choses à apprendre.

    Blog: marouene.slimi.net

    mercredi 26 septembre 2012 16:10