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

Entity Framework Discussion :

Domain-Driven Development et generic repository


Sujet :

Entity Framework

  1. #1
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut Domain-Driven Development et generic repository
    Salut a tous !

    Je suis en train de travailler sur une site asp.net mvc 5 + wepapi2.
    Je m'interroge sur l utilisation de Domain-driven development avec un generic repository.

    J'ai 3 projects dans ma solution
    - Infrastructure avec le context de la bdd + repository
    - Core avec les entities
    - site web asp.net mvc + angular.

    Ma question est la suivante ... Creeriez vous un autre project (comme domain service) ou vous faites les appels du controller seront fait? ou appeleriez vous les methodes de votre repository directement de votre controller? Cette derniere solution me parait un peu dangeureuse dans la mesure ou toute la logique est dans le controller...

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Le repository est déjà une abstraction métier de haut niveau donc aucun souci pour taper "directement" dedans.
    C'est manipuler directement les DbContexts comme des repository qui peut être discutable.

    Mais comme toujours, et comme c'est loin d'être la règle en informatique, c'est le pragmatisme qui doit primer et il faut se poser les bonnes questions : pourquoi concrètement veux-tu découpler ?
    Si comme argument tu ne vois que des avantages théoriques, des mots, alors c'est que tu n'en as sûrement pas besoin.
    Si en revanche tu VAS (j'ai bien dis "VAS" pas "éventuellement en cas d'alignement de Saturne et Uranus un jour de pleine lune" ) réutiliser ta logique applicative alors oui crée cette couche.

    Après ce n'est pas tout ou rien : si tu as des règles métiers bien définies, aussi basiques que la complexité des mots de passe, ou bien aussi complexes que des processus métiers alors tu devrais les isoler dans des composants dédiés dès maintenant.
    Si plus tard (typiquement dans quelques années si tout n'a pas été refait from scratch) tu as besoin de réutiliser tu auras fait l'essentiel et il te restera à sortir le reste pour constituer une vraie couche service.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci !

    Oui je pense que, pour le moment, je vais eviter la couche service supplementaire pour le moment.
    Autre question... Je ne vois pas trop l'interet du Lazy Loading...
    Je m explique... Si je comprends bien, le lazy loading permet d effectuer une requete qu au moment desire....
    Example, si un user a plusieurs roles, les roles ne seront "load" qu'au moment ou la propriete Role de User sera acceder...

    Sur le principe, je le comprends bien et cela permet de charger une entite sans les associations si elles sont inutiles... Mais ne perdons nous pas en controle de ce qui est fait derriere par rapport au eager loading? En eager loading, les roles ne serait binde que si un include a ete fait...
    De plus, avec le lazy loading, on se retrouve a faire une requete par role pour chaque user... result, si un user possede 4 roles, il y aura 4 acces a la DB pour recuperer les details de chaque role...
    A l inverse avec le eager loading, tout sera charge en une fois et en une requete... N'est pas mieux d utiliser le eager loading dans tous les cas afin d avoir plus de controles sur les acces a la bdd?

    Personnellement, je vois plus d inconvenients que d avantages a utiliser le lazy loading... quelqu un peut m eclairer sur les gros avantages du lazy loading?

    Merci

  4. #4
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Tout dépend du pattern d'utilisation de ces données :
    - s'il est déterministe, i.e. tu sais que tu as besoin de telle ou telle donnée alors en effet charger en différé n'a pas d'intérêt et coûte pour rien
    - s'il est aléatoire, i.e. tu ne sais pas à l'avance celles que tu utiliseras le lazy-loading de permet de payer juste pour ce que tu utilises, avec un premium cependant (un aller-retour par donnée)

    Quand tu as peu de données tout charger tout le temps même si tu t'en sers rarement n'a pas un gros impact.

    Le lazy-loading est surtout pertinent quand tu as des gros objets : e.g. tu es Flickr et tu ne veux surtout pas charger les photos de suite donc tu as typiquement une entité qui stocke les métadonnées de la photo et qui pointe vers les données binaires de la photo qui ne seront chargées qu'à la demande.

    Et n'oublie pas que tu as un 3ème mode d'accès moins connu qui se situe entre les deux : le Load à partir de l'entrée de suivi de l'entité : c'est à la fois explicite et différé.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci !
    Je ne comprends pas trop ... pour moi, le mode Load est celui par defaut de EF non?
    Ou alors j'ai mal compris le fonctionnement...
    Imaginons que j'ai une table User et une table Role.
    Si le Lazy Loading dans EF n'est pas actif, que se passe-t-il si je fais User.ToList() ?
    Vais-je avoir la liste des users et, pour chaque user, son role directement meme si je n'accede pas a son role? ou dois-je faire User.Include(x => x.Role).ToList() pour avoir les roles lies a chaque user en une seule requete?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Voici un petit exemple pour tester le LazyLoading...

    "Schéma" :
    Nom : Schema.jpg
Affichages : 163
Taille : 37,9 Ko

    Et voici le code de test :
    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
            static void Main(string[] args)
            {
                using (var db = new KatBlogEntities())
                {
                    List<Post> posts;
                    //On test le mode de LazyLoadingEnabled pour effectuer la bonne requête.
                    if (db.Configuration.LazyLoadingEnabled)
                    {
                        posts = db.Posts.Take(10).ToList();
                    }
                    else
                    {
                        posts = db.Posts.Include("Category").Take(10).ToList();
                    }
     
                    foreach (var post in posts)
                    {
                        //Si on est en "LazyLoadingEnabled = false" et que l'on utilise "posts = db.Posts.Take(10).ToList();";
                        //Alors nous aurons une erreur (NullReferenceException)
                        Console.WriteLine("Post titre : {0} - Categorie Name : {1}", post.Title, post.Category.Name);
                    }
     
                }
                Console.ReadLine();
            }
    En espérant que c'est quelques lignes pourront t'éclairer.

  7. #7
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par trihanhcie Voir le message
    Merci !
    Je ne comprends pas trop ... pour moi, le mode Load est celui par defaut de EF non?
    Ou alors j'ai mal compris le fonctionnement...
    Par défaut le lazy-loading est activé, i.e. EF tentera de l'utiliser.
    Mais il faut aussi que tes entités s'y prêtent, i.e. que les propriétés de navigation soient virtuelles.
    Si ce n'est pas le cas alors c'est au développeur d'indiquer explicitement de charger les données via Include et/ou Load.

    Citation Envoyé par trihanhcie Voir le message
    Imaginons que j'ai une table User et une table Role.
    Si le Lazy Loading dans EF n'est pas actif, que se passe-t-il si je fais User.ToList() ?
    Vais-je avoir la liste des users et, pour chaque user, son role directement meme si je n'accede pas a son role? ou dois-je faire User.Include(x => x.Role).ToList() pour avoir les roles lies a chaque user en une seule requete?
    Sans lazy-loading les listes de rôles seront null et il te faudra en effet indiquer le chargement soit :
    - lors de la remontée initiale via Include
    - plus tard via Load.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Mais il faut aussi que tes entités s'y prêtent, i.e. que les propriétés de navigation soient virtuelles.
    Si ce n'est pas le cas alors c'est au développeur d'indiquer explicitement de charger les données via Include et/ou Load.
    Merci, j'ai enfin compris la maniere dont cela fonctionne maintenant grace a ces 2 phrases

    Et n'oublie pas que tu as un 3ème mode d'accès moins connu qui se situe entre les deux : le Load à partir de l'entrée de suivi de l'entité : c'est à la fois explicite et différé.
    Un lien pour cela? ou s'agit il simplement de ce qui a ete mentionne ci-dessus? A savoir lazy-loading utilise le "Load" ou "Include" au besoin?

    Merci !

  9. #9
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par trihanhcie Voir le message
    Un lien pour cela? ou s'agit il simplement de ce qui a ete mentionne ci-dessus? A savoir lazy-loading utilise le "Load" ou "Include" au besoin?
    C'est ce qui a été mentionné au-dessus.

    Pour résumer voici la typologie des politiques de chargement :
    - immédiat : via Include
    - différé :
    ....- automatique : via le lazy-loading
    ....- manuel : via Load
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Voici un petit lien :

    Loading Related Entities

  11. #11
    Membre actif
    Inscrit en
    Février 2006
    Messages
    522
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 522
    Points : 282
    Points
    282
    Par défaut
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. * Driven Development
    Par gocif68 dans le forum Méthodes Agiles
    Réponses: 2
    Dernier message: 04/05/2011, 09h06
  2. Test driven development
    Par tnarol dans le forum Méthodes
    Réponses: 4
    Dernier message: 24/03/2010, 19h47
  3. Domain Driven Design
    Par michouhinda dans le forum Autres
    Réponses: 5
    Dernier message: 28/08/2008, 12h09

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