使用业务和数据模型层时如何使用Asp.net身份

时间:2019-04-11 14:16:03

标签: c# asp.net-core asp.net-identity

我正在创建具有分层体系结构的应用程序。我分开了
+仅模型类的“ DataModel”项目
+包含我的业务的“ BusinessLogic”项目
+用于从ui运行业务的“核心”项目
+'ViewModel'项目
+带有asp.net核心应用程序的“ Web”项目。

我的目标是分离这些项目,以便Web项目对DataModel一无所知,因此Web项目应仅引用Core和ViewModel。在配置Asp.Net Identity之前,一切都非常好-为了配置授权,我不得不引用我想避免的DataModel项目。是否可以实现我的目标,以及(如果可以的话)如何实现这一目标。

注意:
我正在使用这个how to separate model library when using asp.net identity来写我的问题,但我找不到可接受的答案作为答案!

1 个答案:

答案 0 :(得分:1)

创建直接使用身份的网站时,必须为其提供各种身份“商店”:UserStore<TUser>RoleStore<TRole>等。默认且最简单的方法是将Entity Framework Core用作商店的支持,并且Identity带有内置商店,可与EF Core配合使用。但是,使用该功能需要访问上下文,这意味着您将需要对数据层的依赖。使用AddEntityFrameworkStores<TContext>时无法解决。

如果要使数据层保持抽象,则需要1)使用集中式身份提供程序(例如IdentityServer)或2)创建自定义存储。

例如,

IdentityServer支持同时使用EF和Identity作为支持。这确实意味着 it 将需要依赖于您的数据层,但是IdentityServer将存在于单独的项目中。您的实际网站将通过IdentityServer端点处理身份验证,因此将不依赖于您的数据层。实际上,它甚至根本不知道或不在乎您当时正在使用Identity。

显然,创建自定义存储会更加困难,并且除非您提供一个真正的抽象层,否则最终仍然会最终依赖于数据层。这可能类似于微服务,其中存储实际上将向服务发出HTTP请求以获取所需的对象,而不是直接进行数据库查询。然后,微服务将保留数据依赖性。

您可能没有考虑的一件事是,即使没有直接引用,该依赖项仍然存在。例如,如果您的Core项目使用了DataModel项目中的内容,然后您的Web项目使用了Core项目中的内容,则您的Web项目对DataModel项目具有隐式依赖项。例如,如果您在构建后查看bin文件夹,则会看到一个用于DataModel项目的DLL,甚至那里的一个EF Core的DLL,尽管在Web项目中未明确使用这两个。在这种情况下,使用单独的项目仅有助于以更简洁和易于理解的方式划分逻辑,但 并不能真正抽象出任何依赖关系。