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-tiers - gestion de l’agrégation entre BO


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut Architecture n-tiers - gestion de l’agrégation entre BO
    Bonjour,

    Suite à l'a mise en place d'une architecture logiciel n-tiers composée des 4 couches (BO, DAL, BLL, UI), j'ai une question concernant cette architecture lorsque l'on agrège de BO entre eux. Dans la situation exemple suivante, j'ai un (BO) PERSONNE qui peux contenir une collection de (BO) ADRESSE, et je demande quelle est la meilleure méthode pour charger cette collection. En effet, dans mon architecture le DAL et le BLL sont des classes statiques recevant en paramètre mes BO (ce qui me semble plutôt bien, la logique métier et les accès données ne sont pas dupliqué pour chaque BO créé, ce qui évide d’alourdir inutilement les BO) mais comment faire pour que le BO puisse charger dynamiquement sa collection a l’appel de celle-ci (technique du Lazy loading) alors que seul le DAL a les méthodes d’accès données.

    N’hésitez pas à me donner votre avis ou me faire parvenir des bouts de code.

    Merci par avance,
    Cordialement,

    Sylum

    PS : Merci à Thomas LEBRUN pour son excellant article : http://morpheus.developpez.com/architecture/

    Abréviation
    BLL : Business Logic Layer
    DAL: Data Access Layer
    BO: Business Object
    UI: User interface

    Ci-dessous les classes BO décrivant l'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
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
     
    using System;
     
    using System.Collections.Generic;
     
    using System.Text;
     
     
     
    namespace CollectionApplication
     
    {
     
     
     
      // A delegate type for hooking up change notifications.
     
      public delegate void ChangedEventHandler(object sender, EventArgs e);
     
     
     
      class Person
     
      {
     
        public event ChangedEventHandler PersonChanged;
     
     
     
        protected virtual void OnPersonChanged(EventArgs e)
     
        {
     
          if (PersonChanged != null)
     
            PersonChanged(this, e);
     
        }
     
     
     
        public Person(string pFirstName, string pLastName)
     
        {
     
          _FirstName = FirstName;
     
          _LastName = LastName;
     
          OnPersonChanged(EventArgs.Empty);
     
        }
     
     
     
        private string _FirstName;
     
        public string FirstName
     
        {
     
          get { return _FirstName; }
     
          set { _FirstName = value; OnPersonChanged(EventArgs.Empty); }
     
        }
     
     
     
        private string _LastName;
     
        public string LastName
     
        {
     
          get { return _LastName; }
     
          set { _LastName = value; OnPersonChanged(EventArgs.Empty); ; }
     
        }
     
     
     
        private List<Address> _ListAddress;
     
        public List<Address> ListAddress
     
        {
     
          get { return _ListAddress; }
     
          set { _ListAddress = value; OnPersonChanged(EventArgs.Empty); ; }
     
        }
     
     
     
      }
     
     
     
      class Address
     
      {
     
     
     
        public event ChangedEventHandler AddressChanged;
     
     
     
        protected virtual void OnAddressChanged(EventArgs e)
     
        {
     
          if (AddressChanged != null)
     
            AddressChanged(this, e);
     
        }
     
     
     
        private string _FirstName;
     
        public string FirstName
     
        {
     
          get { return _FirstName; }
     
          set { _FirstName = value; OnPersonChanged(EventArgs.Empty); }
     
        }
     
     
     
        private string _City;
     
        public string City
     
        {
     
          get { return _City; }
     
          set { _City = value; OnAddressChanged(EventArgs.Empty); ; }
     
        }
     
     
     
      }
     
     
     
      class ListPersons
     
      {
     
        public List<Person> PersonsList = new List<Person>();
     
     
     
        public ListPersons()
     
        {
     
          PersonsList.Add(new Person("One", "AAA"));
     
          PersonsList.Add(new Person("Two", "BBB"));
     
          PersonsList.Add(new Person("Three", "CCC"));
     
        }
     
     
     
        // This will be called whenever the list changes.
     
        private void ListChanged(object sender, EventArgs e)
     
        {
     
          Console.WriteLine("This is called when the event fires.");
     
        }
     
     
     
      }
     
     
     
    }

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    Alors une petite rectification pour commencer les BO ne sont pas une couche d'une archi en couche, ils font plutôt partie de la couche transverse au sens qu'ils sont utilisés dans toutes les couches.

    C'est pourquoi pour moi un chargement dynamique à l'appel de la propriété n'a pas de sens, parce que à partir de quelles couches récupérer les données vu que les BO sont transverses. La réponse serait à partir de la couche appelant la propriété mais ça risque de devenir vite compliqué.

    En gros ce que je comprend de ce que tu exprimes c'est que tu charges initialement la liste des personnes sans pour autant récupérer leurs adresses (ce qui est totalement justifiables car tu n'as pas forcément toujours besoin des adresses de tout le monde). Ensuite pour certaines personnes tu souhaites récupérer leurs adresses (probablement suite à une action de l'utilisateur).

    Pour moi, tu dois prévoir dans tes couches, une méthode permettant de récupérer les adresses d'une personne (ou plusieurs si besoin je dis ça pour les perf) si la liste les contenant n'a pas encore été chargée.

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Hello,

    Je pense que dans tes BO il faudrait marquer si le parent (Person) a chargé la listes de ses enfants (address) ou non. Ensuite la BLL doit fournir les méthodes pour les charger au cas ou cela n'est pas le cas. Je suppose que dans ta BLL, tu as une méthode pour charger la liste des personnes. De la même manière il faudra une méthode qui charge la liste des address pour une person donnée...

    Sinon, si c'est pour faire une vue maître/détail, je pense qu'il y a plus simple: un BO simple en lecture seule (par rapport à la BDD) qui sert à afficher la vue maitre, et ensuite au moment de la sélection, le "vrai" chargement de l'objet "person" avec ses enfants déjà chargés (pour le détail)...

    Christophe

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/06/2009, 08h34
  2. Réponses: 1
    Dernier message: 22/05/2008, 10h56
  3. [Forms] : Gestion de Navigation entre module
    Par patmaba dans le forum Forms
    Réponses: 12
    Dernier message: 09/04/2004, 14h09
  4. [Design Patterns] Architecture 3 tiers
    Par HPJ dans le forum Design Patterns
    Réponses: 1
    Dernier message: 29/07/2003, 11h49
  5. Réponses: 4
    Dernier message: 04/07/2002, 12h31

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