解耦ASP.NET MVC 5 Identity以允许实现分层应用程序

Bai*_*ose 43 c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

我是ASP.NET MVC的新手,我一直在开发一个带有个人用户身份验证的MVC 5应用程序.在做我的应用程序时,我一直在做分层模式,比如分离模型层,DAL层,Repos等等.但是现在在MVC 5中,我希望能够使用他们称之为Identity的用户和角色管理和身份验证,然后仍然有我的应用程序的分层结构,因为现在似乎Identity与MVC项目本身,其中的用户和角色模型以及上下文相结合.

我现在在我的应用程序中所做的是我在MVC项目(在单独的文件夹中)中拥有所有我应该要分离的层,如我的DAL,UnitOfWork,Repos,其他模型等,只是为了使它工作,现在.我知道这不是正确的做法.

所以,任何人都可以向我指出一些关于这个的好例子或文章,或者直接解释它是否可能以及如何?Google对此并不友好.谢谢!

Vli*_*nce 33

这是我尝试的快速草稿......我会创建这些图层:

  • Contoso.Core(类库)
  • Contoso.Data(类库)
  • Contoso.Service(类库)
  • Contoso.Web.Framework(类库)
  • Contoso.Web(ASP.NET MVC 5.0)

Contoso.Core:

该层包含表示我的数据库TABLES的所有实体/类.

所以,例如,我会有一个:

  • User.cs类.
  • Product.cs类
  • ProductDetail.cs类
  • 等等..

有些人称这些实体/类:域对象,其他人称之为POCO类.

或者,这些实体/类在核心层中定义,因为它们可以(或可以不)在其他层中使用.


Contoso.Data:

这个层是我定义我的ContosoDbContext.cs类的地方.它在我所有DbSet<>定义的文件中.例如,我在我的内容中会有以下内容ContosoDbContext.cs:

  • public DbSet User {get; 组; }
  • public DbSet Product {get; 组; }
  • public DbSet ProductDetail {get; 组; }

不用说,Contoso.Data层将在图层上具有依赖性Contoso.Core.另外,Contoso.Data我将拥有我的Generic Repository以及与"数据访问"相关的任何内容.


Contoso.Service:

这一层将是我放置所有业务规则的地方.例如,我可能有一个UserService.cs可以有Login()方法的类.Login()方法将接收用户名/密码并调用存储库以查找用户.

因为服务层需要存储库,所以我将在Contoso.Data图层上具有依赖关系,因为我将使用User类(碰巧住在Contoso.Core图层内),我也会对该图层有依赖性Contoso.Core.


Contoso.Web.Framework:

该层将依赖于Contoso.Core,Contoso.DataContoso.Service.我会用这个Contoso.Web.Framework层来配置我的依赖注入.


Contoso.Web:

最后一层,即MVC 5.0应用程序,将依赖于层上Contoso.Web.FrameworkAND上的Contoso.ServiceAND Contoso.Core.

控制器将调用生成在Contoso.Service层中定义的类中的方法(例如Login()方法).

Login()方法可能会也可能不会,例如,返回一个User类(null或填充),因为它返回一个User类,并且因为我们在Controller中,所以我们的Contoso.Web层需要依赖于Contoso.ServiceContoso.Core.


当然,我没有详细说明这里或每一层的所有内容,但这只是为了给你一个我使用的架构类型的例子.

到目前为止,我还没有回答你的问题,但我对MVC 5.0及其新的Identity机制知之甚少,我相信该Contoso.CoreMicrosoft.AspNet.Identity.EntityFramework除了需要依赖于Microsoft.AspNet.Identity.Core

同样,我的ContosoDbContext.cs类需要实现IdentityDbContext恰好属于的接口Microsoft.AspNet.Identity.EntityFramework.dll.

这意味着我的Contoso.Data图层将依赖于,Microsoft.AspNet.Identity.EntityFramework并且很可能Microsoft.AspNet.Identity.Core也是...

正如您所说,当您创建一个新的MVC 5.0项目时,所有这些都存在并在单个应用程序中定义.什么都没有或已经分层.因此,在上面的体系结构中,ContosoDbcontext.cs类存在于Contoso.Data层内,而不是直接位于ASP.NET MVC应用程序中.

由于我没有尝试过新的ASP.NET身份,也没有尝试解决问题,我不知道如何诚实地回答你的问题.我想你必须尝试移动东西.

如果您这样做,请随时告诉我们它是如何进行的以及您遇到的问题/问题.

与此同时,我希望这能帮助你解决一些问题.

文斯

  • @Vlince在我开始搜索另一个观点并到达之前,你的架构几乎就是我所知道的(除了.Framework层).唯一不好的是我的实体项目对'Microsoft.AspNet.Identity'的依赖.:'( (3认同)
  • 我做了你说的.我将Identity的依赖项引用到了Core和Data层,我不再在MVC项目本身上使用它们了.但是,正如预期的那样,Core和Data层现在与Identity相结合,这看起来很奇怪,我不知道在非MVC应用程序上使用它们时会遇到什么问题.但是让我的应用程序分层,所以我现在很高兴.谢谢! (2认同)
  • 这个Contoso.Web.Framework的目的是在asp.net MVC应用程序中没有太多东西.例如,如果您计划拥有/配置IoC容器,那么您的asp.net MVC应用程序将需要添加对数据层的引用.由于我不希望我的MVC层看到或意识到数据层,但同时将我所有的IoC内容集中在一个地方,这就是我创建这个名为Web.Framework的小额外层的原因.您可以将此层视为我配置我的asp.net MVC应用程序所需的所有内容的层. (2认同)