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