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 :

Architecture N-tier avec tables très dépendantes [Débutant]


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut Architecture N-tier avec tables très dépendantes
    Bonjour,

    Je suis dans un cas de figure ou j'ai des tables très liées entre elles: par exemple j'ai une table Série(id,Nom) , une table Lieu(id,Nom) et une table Organe(id,nom,...).
    Or dans ma modélisation, un Organe peut être sur plusieurs séries et un organe est sur un Lieu, les Lieux dépendent de la série. (j'explique qu'une partie de ma base)
    Donc Serie->Lieu->Organe j'ai donc une table SERIE_LIEU_ORGANE(idSerie<pk,fk1>,idLieu<pk,fk2>,idOrgane<pk,fk3>)

    Le but de mon projet est d’interroger la base et d'avoir des Datagridview pour faire du CRUD sur les tables de ma base et ensuite faire du CRUD sur les Organes qui sont les éléments les plus complexes à manipuler.
    Je débute avec cette architecture et je voudrais savoir si je m'y prends bien:

    Voici ma DALOrgane:
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    namespace DAL
    {
        public class OrganeProvider
        {
            public  List<OrganeEntity> LoadData()
            {
                List<OrganeEntity> list = new List<OrganeEntity>();
     
                using (OleDbConnection cn = new OleDbConnection())
                {
     
                    string DatabaseName = "Base_Rexx1.accdb";
                    string pathBase = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), @"SNCF\Projet REXX");
                    string DatabaseNameL = System.IO.Path.Combine(pathBase, DatabaseName);
                    cn.ConnectionString = cn.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", DatabaseNameL);
                    cn.Open();
                    using (OleDbCommand cmd = new OleDbCommand())
                    {
                        cmd.CommandText = 
                                    " SELECT table_organe.[id] AS idOrgane,table_serie.[Serie] AS serie,table_serie.[id] AS idSerie,table_lieux.[Lieux] As lieu,table_lieux.[id] AS idLieu,table_famille.Famille As famille,table_famille.[ID] AS idFamille,table_organe.[Libelle]," +
                                  " table_organe.[Description], table_Piece.Symbole  AS Symbole,table_piece.Nom As piece,table_piece.idPiece AS idPiece" +
                                  " FROM (((((rle_serie_lieu_organe " +
                                  " INNER JOIN [table_organe] ON [rle_serie_lieu_organe].[idOrgane] = [table_organe].[id])" +
                                  " INNER JOIN [table_serie] ON [rle_serie_lieu_organe].[idserie] = [table_serie].[id])" +
                                  " INNER JOIN [table_lieux] ON [rle_serie_lieu_organe].[idLieux] = [table_lieux].[id])" +
                                  " INNER JOIN [table_famille] ON [table_organe].[Famille] = [table_famille].[id])" +
                                  " LEFT JOIN [rle_affectation_organe_piece] ON [rle_serie_lieu_organe].[idSerie] = [rle_affectation_organe_piece].[idSerie]" +
                                  " AND [rle_serie_lieu_organe].[idOrgane] = [rle_affectation_organe_piece].[idOrgane]" +
                                  " AND [rle_serie_lieu_organe].[idLieux] = [rle_affectation_organe_piece].[idLieux])" +
                                  " LEFT JOIN [table_piece] ON [rle_affectation_organe_piece].[idPiece] = [table_piece].[idPiece]";
                        cmd.Connection = cn; ;
     
                        using (OleDbDataReader rdr = cmd.ExecuteReader())
                        {
                            while (rdr.Read())
                            {
     
                                OrganeEntity o = new OrganeEntity();
                                FamilleEntity f = new FamilleEntity();
                                SerieEntity s = new SerieEntity();
                                LieuEntity l = new LieuEntity();
     
     
     
                                f.idFamille = (int)rdr["idFamille"];
                                f.nom = rdr["famille"] == DBNull.Value ? string.Empty : rdr["famille"].ToString();
                                s.idSerie = (int)rdr["idSerie"];
                                s.Nom = rdr["serie"].ToString();
                                l.idLieu = (int)rdr["idLieu"];
                                l.Nom = rdr["lieu"].ToString();
     
                                if (rdr["idOrgane"] != DBNull.Value)
                                {
                                    o.idOrgane = (int)rdr["idOrgane"];
                                }
                                o.libelle = rdr["Libelle"] == DBNull.Value ? string.Empty : rdr["Libelle"].ToString();
                                o.description = rdr["Description"] == DBNull.Value ? string.Empty : rdr["Description"].ToString();                 
                                o.famille = f;
                                if(rdr["idPiece"] != DBNull.Value)
                                {
                                    PieceEntity P = new PieceEntity();
                                    P.idPiece = (int)rdr["idPiece"];
                                    P.nom = rdr["piece"].ToString();
                                    if(rdr["Symbole"]!= DBNull.Value)
                                    {
                                        P.symbole = (int)rdr["Symbole"];
     
                                    }
                                    o.piece = P;
     
                                }
                                o.famille = f;
                                o.serie = s;
                                o.lieu = l;
                                list.Add(o);
     
                            }
                        }
                    }
                }
                return list;
            }
        }
    }
    Comme vous le voyez j'utilise une requête assez lourdes pour avoir mes Organes:
    Ma couche DTO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    namespace DTO
    {
        public class OrganeEntity
        {
            public int idOrgane { get; set; }
            public string libelle { get; set; }
            public string description { get; set; }
            public int idFamille { get; set; }
            public PieceEntity piece { get; set; }
            public FamilleEntity famille { get; set; }
            public SerieEntity serie { get; set; }
            public LieuEntity lieu { get; set; }
        }
    }
    Ma couche BLL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace BLL
    {
        public static class OrganeManager
        {
            public static List<OrganeEntity> LoadData()
            {
                return new OrganeProvider().LoadData();
            }
     
        }
    }
    Ce que j'ai du mal à réaliser, c'est que ma base à des règles de gestion qui font que je ne peux pas avoir de doublon dans la table SERIE_LIEU_ORGANE, or dans mon programme si je veux insérer un nouvelle Organe qui est sur une Serie et un Lieu je ne sais pas comment inclure ces vérifications dans le code, est ce ma couche BLL qui gère ça via des appelles de méthodes à ma couches DAL qui renverraient un boléen par exemple ?
    De tout ce que j'ai pu lire, la couche DTO contient des objets qui sont juste là pour faire transiter des données, donc on ne peut pas vraiment remodéliser notre base en objet si je comprend bien et même si on peut, cela serait fastidieux et surement bancale ?
    Voila je vous remercie d'avance !

    Bonne fin de journée.


    Je ne sais pas si j'ai été très clair...

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    So on va partir du fait que c'est du 3-tiers (our simplifier un peu)
    • T'as un tiers presentations qui expose l'information, c'est dans ce tiers que tu trouveras ton projet aspnet ou winform. Cette couche ne devrais avoir aucuns notions de ton modele de donnes(tes tables et des relations entre elles).
    • Viens ensuite le tiers metiers, dans lequel tu trouvera les regles de gestion, c'est un projet de type bibliotheque de classes.
    • Puis enfin le tiers acces aux donnees, qui comprends la DAL. C'est uniquement cette couche qui peut interroger la base de donnees



    La couche presentation doit communiquer uniquement avec la couche metier.
    La couche metier doit pouvoir appeller la couche accees aux donnees.

    => C'est dans ces communications que l'on utilise des dto.

    Pour repondre a tes questions:
    Ce que j'ai du mal à réaliser, c'est que ma base à des règles de gestion qui font que je ne peux pas avoir de doublon dans la table SERIE_LIEU_ORGANE, or dans mon programme si je veux insérer un nouvelle Organe qui est sur une Serie et un Lieu je ne sais pas comment inclure ces vérifications dans le code, est ce ma couche BLL qui gère ça via des appelles de méthodes à ma couches DAL qui renverraient un boléen par exemple ?
    Oui exactement c'est a ta couche BLL de valider les donnees, tu fera ensuite appel a la couche DAL pour realiser l'insert en bdd.

    De tout ce que j'ai pu lire, la couche DTO contient des objets qui sont juste là pour faire transiter des données, donc on ne peut pas vraiment remodéliser notre base en objet si je comprend bien et même si on peut, cela serait fastidieux et surement bancale ?
    Si ta base de donnees est sur un sgbd recent, entity framework est tres conseille, cela te permettra d'avoir des objets qui representent les tables (avec leurs relations). Par contre une fois sorti de la couche business layer, il est tres conseille d'avoir des DTOs plats pour commencer. Il est tout a fait possible qu'un DTO possede des sous DTOs, mais pour commencer evite.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Oui exactement c'est a ta couche BLL de valider les données, tu fera ensuite appel a la couche DAL pour réaliser l'insert en bdd.
    D'accord, et quand on parle de validation, c'est voir si les données pourront être inséré dans la base, pour qu'elle ne nous renvoie pas des exception lié à l'intégrité référentielle etc ?
    Et dans ce cas pourriez vous m'éclairer quand à la façon de vérifier les données, comme je l'ai dit précédemment j'aurais appelé une méthode de vérification que j'aurais codé dans la DAL...
    Mais ^^" c'est très obscure, j'ai commencé l'architecture hier.
    [/QUOTE]
    Si ta base de données est sur un sgbd récent, entity framework est tres conseille, cela te permettra d'avoir des objets qui representent les tables (avec leurs relations). Par contre une fois sorti de la couche business layer, il est tres conseille d'avoir des DTOs plats pour commencer. Il est tout a fait possible qu'un DTO possede des sous DTOs, mais pour commencer evite.
    AHAHAH ahaha ahahha ... je suis contraint de travailler avec Access pour l'instant, mais je fais justement une 3 tiers pour pouvoir faire migrer mon code plus tard ^^"...

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Juste mon grain de sel, car je suis vraiment surpris par les dénominations que vous employez ici…

    Vous parlez d'architecture N-tiers.

    A la base, comme son nom d'indique, une architecture N-tiers implique… plusieurs tiers.
    A savoir, par exemple pour le paiement sur un site marchand, on a une architecture 3 tiers, voir plus :
    - Le client
    - Le marchand
    - La banque, ou autre service de paiement

    Ce type d'architecture permet de garantir au marchand que le client paie avec un moyen de paiement valide, et au client que son paiement en bien pris en compte pour le montant accordé.

    Par la suite, la dénomination N-tiers a été étendue au architectures multi-services, ou multi-serveurs.
    Par exemple, une application web sur un serveur, une application backoffice sur un autre, et la base de données sur un troisième.
    On parle de tiers ici encore, car ce sont des applications distinctes, dont certaines sont publiées par des éditeurs différents sans aucun lien entre elles (Microsoft ou Oracle ne se soucient pas de votre application pour écrire leur SGBD).

    Cependant, ici vous parlez d'un programme agencé en plusieurs module, ou couches.
    Je ne vois pas la notion de tiers là dedans… c'est juste de la programmation modulaire, comme MVC par exemple.
    Ne parlez pas d'architecture N-tiers, c'est juste un contre-sens.
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Effectivement, ici il s'agit juste de faire communiquer mes couches entre elles, et d'essayer de gérer une base de données correctement ^^".
    Quand bien même j'ai quelque difficultés avec l'utilisation de ces couches ^^"

    EDIT: Un autre point bloquant, c'est que je ne vois pas comment refléter les modifications dans la base au niveau de l'IHM.
    Je m'explique, via un DataGridView (DGV) l'utilisateur voit une list d'objet, il décide d'appuyer sur le bouton "supprimer" qui va appeler la BLL puis la BLL appelle la DAL, la DAL supprime l'élément mais comment m'assurer que l'IHM soit correctement mise à jour ?
    La solution que j'ai trouvé, c'est que la méthode de la DAL est booléenne, et dans le code IHM, je fais un test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(objetManager.Supprimer(objet) == true)
    {
    dgvObjet.CurrentRow.Remove;
    }
    Cela me parait archaïque comme méthode.
    Sachant que le DAL me permet d'avoir une liste d'objet détaillée, le tout serait d'avoir toujours une list d'éléments à jour dans le code facilement manipulable.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    @LecGaël : au lieu de gerer un flag, apres la suppression d'un element de ta grille. fais plus simple et rafraichis la grille avec quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataGridView.DataSource = null;
    dataGridView.DataSource = BuinessLayer.GetGrille();

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par mermich Voir le message
    @LecGaël : au lieu de gerer un flag, apres la suppression d'un element de ta grille. fais plus simple et rafraichis la grille avec quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dataGridView.DataSource = null;
    dataGridView.DataSource = BuinessLayer.GetGrille();
    A chaque manipulation je dois tout rafraichir ? et le jour où j'ai des milliers et des milliers de données

  8. #8
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    A la base, comme son nom d'indique, une architecture N-tiers implique… plusieurs tiers.
    À la base ça vient de l'anglais, où le terme tier (prononcé "tailleur") signifie étage, strate ou niveau. Une architecture N-Tiers désigne donc bien une architecture organisées en couches, le modèle le plus souvent communiqué étant le 3-Tiers (Présentation / Traitements / Persistance). Cela n'a rien à voir au départ avec des tiers au sens de fraction (3 tiers = système divisé en trois parties), ni au sens de parties prenantes.

  9. #9
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par LecGaël Voir le message
    A chaque manipulation je dois tout rafraichir ? et le jour où j'ai des milliers et des milliers de données
    Lorsque tu récupère la liste des objets à afficher, au lieu de l'affecter directement en data source à la DataGridView tu peux les mettre en réserve dans un BindingList, une ObsetrvableCollection ou une autre liste qui implémente INotifyCollectionChanged, et c'est cette liste que tu affectes à la DataGridView. Lorsque tu supprime un objet il te suffira de le retirer de la collection et l'affichage sera automatiquement mis à jour. Ceci-dit cela pose malgré tout la question de la synchronisation des données et de la gestion des erreurs. Si deux personnes utilisent l'application simultanément, l'une peut supprimer un objet que l'autre s'apprête à utiliser et cela posera problème.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    Merci pour ta réponse

    Citation Envoyé par Noxen Voir le message
    Lorsque tu récupère la liste des objets à afficher, au lieu de l'affecter directement en data source à la DataGridView tu peux les mettre en réserve dans un BindingList, une ObsetrvableCollection ou une autre liste qui implémente INotifyCollectionChanged, et c'est cette liste que tu affectes à la DataGridView. Lorsque tu supprime un objet il te suffira de le retirer de la collection et l'affichage sera automatiquement mis à jour. Ceci-dit cela pose malgré tout la question de la synchronisation des données et de la gestion des erreurs. Si deux personnes utilisent l'application simultanément, l'une peut supprimer un objet que l'autre s'apprête à utiliser et cela posera problème.

    Oulah ! quand j'ai demandé pour la gestion de la concurrence on m'a dit "OH tkt pas" et puis on reviendra plus tard en me disant "A plusieurs ça morche po ! "
    Désolé petit coup de gueule

    Et si je voulais prendre en compte le mutli user, il y a des méthodes ?
    Pour ce qui est de BindingList etc, tu aurais des exemples (lien, tutos,autre) pour apprendre ?
    Merci

  11. #11
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par LecGaël Voir le message
    Oulah ! quand j'ai demandé pour la gestion de la concurrence on m'a dit "OH tkt pas" et puis on reviendra plus tard en me disant "A plusieurs ça morche po ! "
    Désolé petit coup de gueule
    Je crois que c'est un peu partout pareil sur ce point : https://www.youtube.com/watch?v=Y3M4...outu.be&t=1804

    Sinon, MSDN :
    BindingList
    ObsevableCollection
    INotifyCollectionChanged

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Merci je vais m'instruire de ce pas :p

    J'aurais une autre question (mon dieu il ne s'arrête jamais !).
    Je suis sur la Form principal mon "MainMenu", dessus il y a différents boutons pour ouvrir différentes Form , or je n'arrive pas à gérer les ouvertures et fermetures, dans le sens ou je voudrais déclarer mes sous formes une seule fois et lorsque l'utilisateur re-clique sur un bouton ça lui ouvre la form sur le process qu'il était en train de faire.
    Exemple: l'utilisateur est en train de remplir un formulaire sur une forme, mais il doit retourner sur le mainMenu et aller lire une info sur une autre form, si il re-clique sur le bouton pour ouvrir la form précédente elle s'ouvre sur le formulaire à moitié remplit.

    Je ne sais pas si on doit jouer avec les Show() ou les Visible() ou bien les deux ^^".

    Merci d'avance

  13. #13
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Noxen Voir le message
    À la base ça vient de l'anglais, où le terme tier (prononcé "tailleur") signifie étage, strate ou niveau. Une architecture N-Tiers désigne donc bien une architecture organisées en couches, le modèle le plus souvent communiqué étant le 3-Tiers (Présentation / Traitements / Persistance). Cela n'a rien à voir au départ avec des tiers au sens de fraction (3 tiers = système divisé en trois parties), ni au sens de parties prenantes.
    Peut-être une déformation de mon parcours professionnel, ou à l'inverse, une déformation liée à l'évolution de l'informatique depuis les années 90...

    Car la première fois où j'ai entendu parler de 3 tiers (ou plus) c'était à la fin des années 90, lorsque la boîte dans laquelle je travaillais faisait des sites webs.

    A l'époque, je n'avais jamais entendu parler de "couches" ou de MVC, qui sont apparus dans mon bagage de connaissance bien plus tard (autour de 10 ans plus tard)...

    Évidement, MVC date de plus tôt, mais fin 90, c'était tout sauf une chose répandue sur les sites web, où MVC est devenu le standard de développement... plus tard dans les années 2000 !
    On ne jouit bien que de ce qu’on partage.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Après moulte recherche, je ne sais pas vers quoi m'orienter, certains disent qu'il ne faut pas manipuler de collection d'objet local et que les objet me servent juste à passer les données vers le BLL puis le DAL pour manipuler la base et d'autres manipulent des collections d'objets en local dans le code.
    Je ne sais pas quel choix est le plus judicieux.

  15. #15
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Citation Envoyé par LecGaël Voir le message
    Merci je vais m'instruire de ce pas :p

    J'aurais une autre question (mon dieu il ne s'arrête jamais !).
    Je suis sur la Form principal mon "MainMenu", dessus il y a différents boutons pour ouvrir différentes Form , or je n'arrive pas à gérer les ouvertures et fermetures, dans le sens ou je voudrais déclarer mes sous formes une seule fois et lorsque l'utilisateur re-clique sur un bouton ça lui ouvre la form sur le process qu'il était en train de faire.
    Exemple: l'utilisateur est en train de remplir un formulaire sur une forme, mais il doit retourner sur le mainMenu et aller lire une info sur une autre form, si il re-clique sur le bouton pour ouvrir la form précédente elle s'ouvre sur le formulaire à moitié remplit.

    Je ne sais pas si on doit jouer avec les Show() ou les Visible() ou bien les deux ^^".

    Merci d'avance
    Il te faut la mettre en variable de classe. Après ce n'est pas très standard comme comportement.. quand on clique sur annuler les données sont en général perdues. On ne s'attend pas à les retrouver.
    Perso je resterai avec une form localte à la fonction de ton bouton détruite apres sa fermeture.

  16. #16
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Tu peux soit avoir dans ton formulaire principal des références vers les différentes Forms que tu crées, soit avoir un objets qui représente l'état de ton application, par exemple les données saisie dans un formulaire, et transmettre la portion concernée à la Form que tu veux ouvrir, soit par le constructeur, soit par une propriété.

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Merci pour vos réponses, finalement j'ai transformé mes mes FORMS en UC puis je les ai intégrées à un TabControl, le rendu est sympa mis à part des artefacts graphiques dans le coin superieur gauche de chaque TabPage , j'ai essayé de virer tout les BorderStyle des panels etc, rien n'y fait....
    Si je clique sur ces aberrations, elles disparaissent...

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par LecGaël Voir le message
    Merci pour vos réponses, finalement j'ai transformé mes mes FORMS en UC puis je les ai intégrées à un TabControl, le rendu est sympa mis à part des artefacts graphiques dans le coin supérieur gauche de chaque TabPage , j'ai essayé de virer tout les BorderStyle des panels etc, rien n'y fait....
    Si je clique sur ces aberrations, elles disparaissent...
    EDIT: J'ai trouvé la solution pour les aberrations.
    Je continu de développer mon architecture en 3 "couches" et je bloque vraiment sur l'utilisation des objets pour manipuler ma base, ce qui me gène c'est que l'on déclare les attributs de nos objets en public.
    Et on ne représente pas les relations qu'on nos objets entre eux...
    Dans mon cas j'ai des associations entre mes tables et je ne vois pas comment représenter ça...

  19. #19
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    C'est effectivement une limitation du modèle classique MVC : le non partage des couches induit des problématiques de logique (impossible de valider l'intégrité des données dans la couche d'accès aux données) et de performances (obligé de recharger maintes fois les mêmes informations, effectuer des dizaines de requêtes là où l'objet métier n'aurait besoin que d'une seule requête, etc.)

    Pour ces raisons, je préfère de mon point de vue tout mettre dans les objets métiers, y compris l'accès aux données.
    Mais en contre partie, je ne gère pas une ligne de SQL dans mon programme, je ne passe que par des vues et procédures stockées.

    Ainsi, la partie "programme" ne fait que de la logique, et la couche "données" est déléguée au SGBD : ça tombe bien, il est fait pour ça.

    La contre partie, c'est que tu ne peux pas utiliser d'ORM ou autres générateurs de code SQL.
    On ne jouit bien que de ce qu’on partage.

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 173
    Points : 67
    Points
    67
    Par défaut
    la couche "données" est déléguée au SGBD : ça tombe bien, il est fait pour ça.
    Super, j'utilise Access pour l'instant... :'(

    Je suis vraiment paumé ^^" dans le sens ou je ne sais pas ce que je dois faire..
    Si j'arrivais à représenter les objets métier correctement après je ne saurai pas comment gérer le CRUD convenablement.
    Mais je vous pose la question suivante, quand vous chargez tous vos "objets" via la BDD, ensuite vous les stockez dans une collection en global ? les inputs de l'utilisateur appelle la DAL pour modifier dans la BDD ET si ça réussi vous modifiez la collection globale ?

    Je dois passer pour un demeuré, mais il y a tellement d'infos partout, d'architectures différentes que... ^^"
    Si jamais vous avez des sources concernant la modélisation point de vue métier je suis preneur

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Architecture n-tier avec mean.js
    Par hannibal_smith dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 23/06/2016, 17h33
  2. Combiner l'architecture 3 tiers avec MVC sous CS
    Par medirama dans le forum ALM
    Réponses: 0
    Dernier message: 24/06/2014, 21h07
  3. Architecture 3-tiers avec Asp.NET
    Par tawaha2010 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 19/05/2012, 21h34
  4. architecture 3-tiers avec swing
    Par Med_Aymen dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/03/2010, 20h47
  5. Réponses: 9
    Dernier message: 10/03/2008, 09h44

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