Découplage ASP.NET identité MVC 5 pour permettre l'implémentation d'une application en couches

Je suis nouveau pour ASP.NET MVC et moi avons développé une application MVC 5 avec une authentification utilisateur individuelle. J'ai fait un motif en couches lorsque je fais mes applications comme séparer la couche de modèle, la couche DAL, les Repos, etc. etc. mais maintenant, dans MVC 5, je veux pouvoir utiliser la gestion et l'authentification des utilisateurs et des rôles qu'ils appellent Identity, puis avoir encore cette structure en couches à mon application car il semble que L'identité soit à peu près couplée au projet MVC lui-même avec l'utilisateur et les modèles de rôle là-bas et le contexte aussi.

Ce que j'ai fait dans mon application pour l'instant, c'est que j'ai toutes mes couches supposées être séparées comme mon Dal, UnitOfWork, Repos, autres modèles, etc. dans le projet MVC (dans des dossiers séparés!) juste pour le faire fonctionner, pour l'instant. Et je sais que ce n'est pas la bonne façon de le faire.

Quelqu'un peut-il me montrer quelques bons exemples ou articles à ce sujet ou l'expliquer directement si c'est possible ou non et comment? Google n'a pas été amical avec moi sur celui-ci. Merci!

40
demandé sur Bairose 2013-12-04 16:29:45

1 réponses

Voici un Brouillon rapide de ce que j'essaierais...Je créerais ces couches:

  • Contoso.Noyau (Bibliothèque De Classes)
  • Contoso.Données (Bibliothèque De Classes)
  • Contoso.Service (Bibliothèque De Classes)
  • Contoso.Web.Cadre (Bibliothèque De Classes)
  • Contoso.Web (ASP.NET MVC 5.0)

Contoso.Noyau:

Cette couche contient toutes mes entités / classes représentant mes TABLES de base de données.

Par exemple, j'aurais a:

  • utilisateur.cs de la classe.
  • produit.classe cs
  • ProductDetail.classe cs
  • etc..

Certaines personnes appellent ces entités / classes: les objets de domaine, d'autres l'appellent les classes POCO.

Soit ou, ces entités / classes sont définies dans la couche centrale puisqu'elles peuvent (ou non) être utilisées parmi les autres couches.


Contoso.Données:

Cette couche est l'endroit où je définis ma classe ContosoDbContext.cs. Il est à l'intérieur de ce fichier que j'ai tous mes DbSet<> définis. Ainsi, par exemple, j'aurais ce qui suit dans mon ContosoDbContext.cs:

  • Utilisateur public DbSet { get; set;}
  • produit Public DbSet { get; set;}
  • public DbSet ProductDetail { get; set;}

Inutile de dire, le Contoso.La couche de données aura une dépendance sur la couche Contoso.Core. De plus, c'est à l'intérieur de cette couche Contoso.Data que j'aurais mon référentiel générique et tout ce qui est lié à " data accès".


Contoso.Service:

Cette couche serait l'endroit où je placerais toutes mes règles métier. Par exemple, je peux avoir une classe UserService.cs qui pourrait avoir une méthode Login(). La méthode Login () recevrait un nom d'utilisateur / mot de passe et appellerait le référentiel pour rechercher l'utilisateur.

Parce que la couche de Service a besoin du référentiel, j'aurai une dépendance sur la couche Contoso.Data et parce que je vais jouer avec la classe User (qui vit à l'intérieur de la Contoso.Core couche), j'aurai aussi une dépendance sur la couche Contoso.Core.


Contoso.Web.Cadre:

Cette couche aurait une dépendance sur le Contoso.Core, Contoso.Data et Contoso.Service. J'utiliserais cette couche Contoso.Web.Framework pour configurer mon Injection de dépendance.


Contoso.Web:

La dernière couche, l'application MVC 5.0, aurait une dépendance sur les Contoso.Web.Framework et sur les Contoso.Service et sur les Contoso.Core couches.

Les contrôleurs, invoqueraient des méthodes vivre à l'intérieur des classes définies dans votre couche Contoso.Service (par exemple la méthode Login ()).

La méthode Login () peut ou non, par exemple, renvoyer une classe Utilisateur (null ou peuplée) et parce qu'elle renvoie une classe Utilisateur et parce que nous sommes à l'intérieur d'un contrôleur, notre couche Contoso.Web a besoin d'une dépendance sur Contoso.Service et Contoso.Core.


Bien sûr, je n'ai pas tout détaillé ici ou chaque couche mais c'est juste pour vous donner un exemple du type d'architecture que je ferais utiliser.

Jusqu'à présent, je n'ai pas répondu à votre question mais avec peu de choses que je connais sur MVC 5.0 et son nouveau mécanisme D'identité, je crois que la couche Contoso.Core devrait avoir une dépendance sur Microsoft.AspNet.Identity.EntityFramework en plus du Microsoft.AspNet.Identity.Core

De même, ma classe ContosoDbContext.cs devrait implémenter l'interface IdentityDbContext qui appartient à la Microsoft.AspNet.Identity.EntityFramework.dll.

Cela signifie que mon Contoso.Data couche aurait une dépendance sur Microsoft.AspNet.Identity.EntityFramework, probablement de la Microsoft.AspNet.Identity.Core ainsi...

Comme vous le dites, lorsque vous créez un nouveau projet MVC 5.0, tout cela existe et est défini dans l'application unique. Rien n'est ou n'a été découplé en couches. Ainsi, dans l'architecture ci-dessus, la classe ContosoDbcontext.cs vit à l'intérieur de la couche Contoso.Data et non directement à l'intérieur de la ASP.NET application MVC.

Depuis que je n'ai pas essayé le nouveau ASP.NET identité ni Ai-je essayé de découpler les choses autour, Je ne saurais pas comment répondre honnêtement à votre question. Je suppose que vous devrez essayer de faire bouger les choses.

Si et quand vous faire, n'hésitez pas à nous dire comment ça s'est passé et quelles sont les choses/problèmes rencontrés.

Pendant ce temps, j'espère que cela vous a aidé à faire la lumière (ou non).

Vince

32
répondu Vlince 2013-12-04 16:38:21