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

ASP.NET MVC Discussion :

Architecturer un projet MVC en N-tiers, avec entity framework


Sujet :

ASP.NET MVC

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 208
    Points : 395
    Points
    395
    Par défaut Architecturer un projet MVC en N-tiers, avec entity framework
    Bonjour à tous,

    Afin de me former à entity framework, j'ai suivi le tutoriel "Contoso University" de Microsoft.

    Ce tutoriel permet de réaliser un site web en MVC avec entity framework et en utilisant les pattern repository et unit of work.
    A la fin de celui-ci, on se retrouve donc avec la solution suivante sous visual studio :




    J'aimerai maintenant modifier mon projet pour le séparer en couche :
    - présentation
    - logique métier
    - accès à la base de données

    Mais je bloque pas mal sur ce point

    Dans un premier temps, j'ai crée deux nouveaux projets :
    - BLL, dans lequel j'ai déplacé le répertoire "Models" et "ViewModels" de ma solution initiale
    - DAL, dans lequel j'ai déplace le répertoire "DAL" de ma solution initiale

    Mais ce faisant, pour que mon projet DAL fonctionne, je dois lui rajouter une référence vers le projet BLL (le fichier SchoolContext a besoin de connaitre les objets définis dans le Model, de même pour l'implémentation du pattern uow, etc...).
    Et avec cette configuration, j'ai l'impression d'être à côté de la plaque. En effet, mes controllers vont appeler un objet "unit of work", mais celui ci est dans la couche DAL et dépend de la couche BLL

    De façon plus globale, comment passer d'un modèle en MVC, en un modèle MVC N-tiers, lorsque l'on utilise entity framework (code-first) ?
    J'ai parcouru de nombreux exemples sur le net, mais à chaque fois il y'a pleins d’éléments en plus qui complexifie et je ne m'y retrouve plus. C'est pour ça que je voulais repartir d'un exemple que j'ai à priori compris.

    Merci d'avance

  2. #2
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Bonjour,

    La première chose à faire est de penser au besoin de chaque couche en partant de la DB jusqu'à l'application.

    Que doit faire la DAL? Que doit-elle retourner?

    La DAL va te permettre de renvoyer des objets qui ont pratiquement le même schéma que les tables de la base de données.

    Donc ton "Model" doit se retrouver obligatoirement à ce niveau. Pour ma part en utilisant l'approche Code First, cela me pose pas de problème de renvoyer directement les "entités". Par contre à l'utilisation de "Model First" ou "Database First", il est conseillé de ne pas renvoyer les entités mais des DTO (ou POCO).

    Personnellement, j'utiliserais le principe du "Repository Pattern" à cet endroit.

    Autour du BLL avec les mêmes questions. Que doit-il faire et retourner?

    Pour sa part, le BLL va traiter les informations provenant de la DAL et de l'UI. Faire des vérifications, des traitements "logique" et pour ma part je rajouterais des transformations.

    Dans ce cas, je choisis donc de mettre mes "ViewModel" dans ce projet et le BLL va donc transformer les Models en ViewModel.
    Dans ce cas les principes de base sont respectés.

    DAL: N'a besoin de rien.
    BLL: Connait que DAL
    UI: Connait que BLL

    Sur ce, bonne journée et courage.
    ****** Analyse/Développeur .Net

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 208
    Points : 395
    Points
    395
    Par défaut
    Déjà merci de ta réponse.

    Pour être sur d'avoir bien compris, dans ton cas de figure tu doit donc avoir :
    - un viewModel par Model,
    - les entités d'entityFramework font office de de Model.

    Par contre, un truc que je ne comprends pas bien, dans tes controllers comment fais tu les appels aux fonctions de persistances ? Met tu les appels aux repository dans les viewModels ?

  4. #4
    Membre averti
    Avatar de SoBaKa
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 242
    Points : 349
    Points
    349
    Par défaut
    Citation Envoyé par Arnaud13 Voir le message
    Pour être sur d'avoir bien compris, dans ton cas de figure tu doit donc avoir :
    - un viewModel par Model,
    Non, tu aurais plutôt un ViewModel par View. Mais ce concept est plutôt lié directement à la partie MVC.

    Citation Envoyé par Arnaud13 Voir le message
    - les entités d'entityFramework font office de de Model.
    Dans ce cas-ci oui.

    Citation Envoyé par Arnaud13 Voir le message
    Par contre, un truc que je ne comprends pas bien, dans tes controllers comment fais tu les appels aux fonctions de persistances ? Met tu les appels aux repository dans les viewModels ?
    Un petit Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MVC:             Controller
                         |
                         |
    BLL : List<UserViewModel> GetAllUsers();
                         |
                         |
    DAL : List<User> GetAllUsers();
    Donc c'est l'exemple le plus simple ici, et le GetAllUsers de la BLL va juste convertir les "User" en "UserViewModel".
    ****** Analyse/Développeur .Net

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 208
    Points : 395
    Points
    395
    Par défaut
    Citation Envoyé par SoBaKa
    Non, tu aurais plutôt un ViewModel par View. Mais ce concept est plutôt lié directement à la partie MVC.
    Effectivement, erreur de langage dans mes propos


    Citation Envoyé par SoBaKa
    Donc c'est l'exemple le plus simple ici, et le GetAllUsers de la BLL va juste convertir les "User" en "UserViewModel".
    Je crois que c'est le point qui me manquait. Je voulais que mes entités correspondent à mes Models, mais en fait, il faudrait que je crée pour chaque entités une classe dans ma BLL qui utilise le repository qui va bien ? D'ailleurs quel nom donne t on à ces classes ?

    Après, soit j'utilise directement les entités dans ces classes de ma BLL, soit je convertis mes entités en DTO. C'est bien cela ?

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 208
    Points : 395
    Points
    395
    Par défaut
    En discutant un peu avec un collègue et avec les infos de ce message je pense faire de la façon suivante :

    - utilisant de viewModel pour la partie UI
    - utilisant de classe Domain pour la partie BLL
    - utilisant des entités d'entity framework pour la partie DAL

    pour une entité simple, je vais copier les mêmes propriétés dans la classe Domain et dans la viewModel et utiliser des DTO pour passer les informations d'une couche à l'autre.
    C'est redondant aux niveaux des classes de chaque couche, mais comme ça j'ai une bonne séparation.

    Je laisse ce message ouvert quelques temps, voir s'il y'a des retours sur la solution que j'envisage et je le passerai en résolu.

    Merci SoBaKa

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Points : 88
    Points
    88
    Par défaut
    Le coté redondant est un "code smell", ça veut dire que la maintenance sera plus difficile car tu devras modifier le code à plusieurs endroits !

    En fait l'approche que tu décrit est utile dans le cas où ta couche UI et ta couche BLL/DAL sont sur des machines différentes, dans ce cas tu ne peux pas faire voyager tes entités sur le réseau, car le plus souvent (ça dépend de l'ORM utilisé, mais c'est le cas par exemple pour Nhibernate) elles sont liés à une connexion BD donc à la machine où elles ont été créés.
    Donc, tu dois passer par un objet intermédiaire (le DTO ou Data Transfert Object) qui lui peut voyager sur le réseau, c'est d'ailleurs sa seule raison d'être.

    Mais, ici ce n'est pas le cas, donc dupliquer les données entre objet du "Domaine" et objet "Entité" est inutile, en fait, c'est justement pour éviter cela que l'on demande aux ORM de pouvoir gérer des POCO (des Plain Old C# object ou "bon vieux objets C#"), ainsi tes entités et ton modèle du domaine sont une seule et même chose.

    Ton modèle du domaine/entité est constitué d'objet dit "anémique", c'est à dire qu'il n'ont pas de méthodes, justes des données. Le comportement associé à ces données, est dans des services qui constituent ta couche BLL (Business Layer, c'est la logique du domaine).

    Enfin, le remplissage des view model à partir des entités, est fait par ton contrôleur, pas par tes services car ce n'est que de la présentation. En fait, tu as même une variante qui se contente d'utiliser les entités comme view model.

Discussions similaires

  1. EFCachingProvider avec Entity Framework 4 et des procédures stockées
    Par aymeric.lagier dans le forum Entity Framework
    Réponses: 2
    Dernier message: 08/07/2010, 19h53
  2. Pour instancier le context avec Entity Framework
    Par aboily dans le forum Entity Framework
    Réponses: 0
    Dernier message: 26/05/2010, 06h28
  3. Problème Ajout Donnée avec Entity Framework
    Par Invité dans le forum Linq
    Réponses: 4
    Dernier message: 14/10/2009, 14h16
  4. Pb de création de modéle avec entity framework
    Par rangdalf dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 25/06/2009, 22h34
  5. Probleme de connexion avec Entities Framework
    Par gstrit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 09/06/2009, 09h09

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