如何在使用业务和数据模型层时使用 Asp.net 标识
How to using Asp.net Identity when using Business And DataModel Layer
我正在创建具有分层架构的应用程序。我有单独的
+ 'DataModel' 项目只有模型 类
+ 'BusinessLogic' 个包含我的业务的项目
+ 来自 ui
的 运行 业务的 'Core' 项目
+ 'ViewModel' 项目
+ 'Web' 具有 asp.net 核心应用程序的项目。
我的目标是将这些项目分开,使 Web 项目对 DataModel 一无所知,因此 Web 项目应该只引用 Core 和 ViewModel。在我配置 Asp.Net Identity 之前,一切都很好——为了配置授权,我不得不引用我想避免的 DataModel 项目。是否可以实现我的目标,以及(如果可以)如何实现。
注:
我正在使用这个 来写我的问题,但我没有找到被接受的答案作为我的答案!
当您创建一个直接使用 Identity 的网站时,您必须为其提供各种 Identity "stores":UserStore<TUser>
、RoleStore<TRole>
等。默认且最简单的方法是使用Entity Framework Core 作为存储的后盾,Identity 带有内置存储以与 EF Core 一起使用。但是,使用它需要访问上下文,这意味着您将需要对数据层的依赖。使用 AddEntityFrameworkStores<TContext>
.
时没有办法解决这个问题
如果您想保持数据层的抽象,则需要 1) 使用集中式身份提供程序,例如 IdentityServer 或 2) 创建自定义存储。
例如,IdentityServer 支持同时使用 EF 和 Identity 作为后盾。这确实意味着 它 将需要对您的数据层的依赖,但 IdentityServer 将存在于一个单独的项目中。您的实际网站将通过 IdentityServer 端点处理身份验证,因此不会依赖于您的数据层。事实上,它甚至根本不知道或不在乎您此时正在使用 Identity。
显然,创建自定义商店会更加困难,除非您提供真正的抽象层,否则您最终仍将依赖于您的数据层。这可能有点像微服务,其中商店实际上会向服务发出 HTTP 请求以获取它需要的对象,而不是直接进行数据库查询。然后,微服务将持有数据依赖性。
你可能没有考虑到的一件事是即使没有直接引用也存在依赖关系。例如,如果您的核心项目使用您的 DataModel 项目中的内容,然后您的 Web 项目使用您的核心项目中的内容,您的 Web 项目对您的 DataModel 项目具有隐式依赖性。例如,如果您在构建后查看 bin 文件夹,您会看到一个用于您的 DataModel 项目的 DLL,甚至一个用于 EF Core 的 DLL,尽管您没有在您的 Web 项目中明确使用其中任何一个。在这种情况下,使用单独的项目仅有助于以一种更简洁和更易于理解的方式划分逻辑,但它确实不会实际抽象出任何依赖关系。
我正在创建具有分层架构的应用程序。我有单独的
+ 'DataModel' 项目只有模型 类
+ 'BusinessLogic' 个包含我的业务的项目
+ 来自 ui
的 运行 业务的 'Core' 项目
+ 'ViewModel' 项目
+ 'Web' 具有 asp.net 核心应用程序的项目。
我的目标是将这些项目分开,使 Web 项目对 DataModel 一无所知,因此 Web 项目应该只引用 Core 和 ViewModel。在我配置 Asp.Net Identity 之前,一切都很好——为了配置授权,我不得不引用我想避免的 DataModel 项目。是否可以实现我的目标,以及(如果可以)如何实现。
注:
我正在使用这个
当您创建一个直接使用 Identity 的网站时,您必须为其提供各种 Identity "stores":UserStore<TUser>
、RoleStore<TRole>
等。默认且最简单的方法是使用Entity Framework Core 作为存储的后盾,Identity 带有内置存储以与 EF Core 一起使用。但是,使用它需要访问上下文,这意味着您将需要对数据层的依赖。使用 AddEntityFrameworkStores<TContext>
.
如果您想保持数据层的抽象,则需要 1) 使用集中式身份提供程序,例如 IdentityServer 或 2) 创建自定义存储。
例如,IdentityServer 支持同时使用 EF 和 Identity 作为后盾。这确实意味着 它 将需要对您的数据层的依赖,但 IdentityServer 将存在于一个单独的项目中。您的实际网站将通过 IdentityServer 端点处理身份验证,因此不会依赖于您的数据层。事实上,它甚至根本不知道或不在乎您此时正在使用 Identity。
显然,创建自定义商店会更加困难,除非您提供真正的抽象层,否则您最终仍将依赖于您的数据层。这可能有点像微服务,其中商店实际上会向服务发出 HTTP 请求以获取它需要的对象,而不是直接进行数据库查询。然后,微服务将持有数据依赖性。
你可能没有考虑到的一件事是即使没有直接引用也存在依赖关系。例如,如果您的核心项目使用您的 DataModel 项目中的内容,然后您的 Web 项目使用您的核心项目中的内容,您的 Web 项目对您的 DataModel 项目具有隐式依赖性。例如,如果您在构建后查看 bin 文件夹,您会看到一个用于您的 DataModel 项目的 DLL,甚至一个用于 EF Core 的 DLL,尽管您没有在您的 Web 项目中明确使用其中任何一个。在这种情况下,使用单独的项目仅有助于以一种更简洁和更易于理解的方式划分逻辑,但它确实不会实际抽象出任何依赖关系。