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

标签 c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

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

我现在在我的应用程序中所做的是我在 MVC 项目(在单独的文件夹中!)中拥有我所有的假设是独立的层,如我的 DAL、UnitOfWork、Repos、其他模型等,只是为了让它工作,对于现在。我知道这不是正确的做法。

那么任何人都可以向我指出一些关于此的很好的例子或文章,或者如果可能与否以及如何直接解释它?谷歌在这个问题上对我并不友好。谢谢!

最佳答案

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

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

  • Contoso.Core:

    该层包含代表我的数据库表的所有实体/类。

    例如,我会有一个:
  • User.cs 类。
  • Product.cs类
  • ProductDetail.cs 类
  • 等。

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

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

    Contoso.Data:

    这一层是我定义我的 ContosoDbContext.cs 的地方类(class)。我所有的 DbSet<> 都在该文件中定义。
    例如,我的 ContosoDbContext.cs 中会有以下内容:
  • 公共(public) DbSet 用户 { 获取;放; }
  • 公共(public) DbSet 产品 { 获取;放; }
  • 公共(public) DbSet ProductDetail { 获取;放; }

  • 不用说,Contoso.Data 层将依赖于 Contoso.Core层。
    另外,里面还有Contoso.Data层,我将拥有我的通用存储库以及与“数据访问”相关的任何内容。

    Contoso.Service:

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

    因为Service层需要Repository,所以我会依赖Contoso.Data层并且因为我将使用 User 类(它恰好位于 Contoso.Core 层内),我还将依赖于 Contoso.Core层。

    Contoso.Web.Framework:

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

    Contoso.Web:

    最后一层,MVC 5.0 应用程序,将依赖于 Contoso.Web.Framework并且在 Contoso.Service并且在 Contoso.Core层。

    Controller 将调用位于 Contoso.Service 中定义的类中的方法。层(例如 Login() 方法)。

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

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

    到目前为止,我还没有回答你的问题,但我对 MVC 5.0 及其新的身份机制知之甚少,我相信 Contoso.Core层需要依赖于 Microsoft.AspNet.Identity.EntityFramework除了Microsoft.AspNet.Identity.Core
    同样,我的 ContosoDbContext.cs类需要实现 IdentityDbContext恰好属于Microsoft.AspNet.Identity.EntityFramework.dll的接口(interface).

    这意味着我的 Contoso.Data层将依赖于 Microsoft.AspNet.Identity.EntityFramework最有可能的是 Microsoft.AspNet.Identity.Core还有……

    正如您所说,当您创建一个新的 MVC 5.0 项目时,所有这些都存在并在单个应用程序中定义。没有任何东西被或已经被解耦到层中。所以在上述架构中 ContosoDbcontext.cs类(class)住在Contoso.Data层而不是直接在 ASP.NET MVC 应用程序内部。

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

    如果您这样做了,请随时告诉我们进展如何以及您遇到了什么事情/问题。

    同时,我希望这能帮助你阐明(或不明白)。

    文斯

    关于c# - 解耦 ASP.NET MVC 5 Identity 以允许实现分层应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20375432/

    相关文章:

    c# - 如何通过配置静态方法来防止故障(内存泄漏)?

    asp.net - Spark-View-Engine 与 ASP.NET MVC2

    c# - 为什么 Request ["host"] == "dev.testhost.com:1234"而 Request.Url.Host == "localhost"

    c# - 如何在 MVC 3 中将 WebForms .ascx 显示为局部 View

    javascript - 跨子域设置 Cookies javascript 陷阱

    asp.net-mvc - 如何在 LINQ to SQL 中将我的对象保存回我的数据库?

    c# - 在设计器模式下,来自 Nuget 的隐形 Windows 8.1 自定义控件

    c# - 默认的 WPF 控件模板在哪里?

    c# - 如何使用 C# 通过 USB 将原始 ZPL 发送到 Zebra 打印机

    asp.net - TextBoxWatermarkExtender 不显示文本