【问题标题】:Separation of ASP.NET Core Identity ApplicationUser with relationship to Domain Model Entity分离 ASP.NET Core Identity ApplicationUser 与域模型实体的关系
【发布时间】:2019-12-29 11:40:25
【问题描述】:

我正在尝试在我的域模型中实现 ASP.NET Core 标识和实体之间的良好分离和架构。

我在使用 ASP.NET Core 构建的 Web 应用程序中使用 Onion 架构。 在核心项目Domain 中,我有域模型,其中一个是Member 实体。

然后在另一个项目 Infrastructure 中,我有内置的 ASP.NET Core Identity 设置,其中包含一个继承自 IdentityUserApplicationUser 类。

    public class ApplicationUser : IdentityUser
    {
    }

将身份用户和成员实体分开的想法很好。 但是,我想将它们联系起来,但使用 Entity Framework Core 这似乎是一个挑战。如果不在我的域模型中添加导航属性,我就无法解决这个问题,我想避免这种情况。

我希望我可以完全使用 Fluent API 而无需添加属性,但似乎并非如此。

关于如何解决这个问题有什么建议吗? 考虑到上述情况,如何在不从核心项目添加依赖项的情况下创建身份用户和域实体之间的关系?

我的问题有些重复或与此处的某些帖子有关,例如

还有其他一些帖子。然而,这些问题的答案似乎是变通方法。也许这是唯一的方法?

我正在使用 ASP.NET Core 3.1 和 Entity Framework 3.1。对于这个项目。

【问题讨论】:

  • 我认为你所说的“域层”实际上是 EF 持久层。无论如何,我非常喜欢完全分离这两个模型,并且只在数据库中创建 1:1 关联而不更改 Identity 表结构。当 IdentityUser 通过 Identity 登录时,您可以使用其 ID 在实际应用程序中与 Member 实体一起工作。这将使身份验证/授权和“真正的”业务很好地分离。
  • 嗨@GertArnold,感谢您的反馈。我不知何故需要将两者联系起来,我正在探索 EF Core 的选项,但我还没有找到一种方法来做到这一点,而不将其引入域层。我会以某种方式需要在 Identity 表中有一个外键,以便将其与成员相关联。 Infrastructure 项目包含 EF 持久性逻辑和 Identity 作为外部关注点,而 Domain 包含实体和相关的域逻辑。
  • @brk 你最终解决了这个问题吗?我现在正在经历它并解决了您链接到的所有问题,但没有取得太大成功。. 基本上我不知道如何处理我的核心项目中的 AppUser ,它必须从 IdentityUser 继承,但核心项目不应该有身份依赖

标签: c# asp.net-core entity-framework-core asp.net-identity onion-architecture


【解决方案1】:

我有同样的业务需求,我需要将身份与其他领域模型分开,我决定遵循以下模式:

1- 创建/注册新用户时,我们会在身份表中添加身份数据

2- 我们将在域模型中添加其他业务数据,比如说教师/学生表

3- 现在我们需要建立两者之间的关系 我们可以通过在“UsersClaims”身份表中向用户添加声明来做到这一点,该表默认具有以下属性(UserId、ClaimType、ClaimValue),因此我们将添加我们的域模型 ID 和身份 ID

通过这样做,我们在身份域之间建立了虚拟关系

这是一种方式,您可以在域模型构建映射表的另一端执行此操作,保存相同的数据(identityUserId 和 domainUserId)

如果需要,您可以将它们分开到不同的数据库中

【讨论】:

    【解决方案2】:

    域模型作为接口怎么样?

    所以你在域项目(和其他类型......)中有一些 IMember,在 DAL 层中你有 DataAccessDbContext 和一组成员:IMember(和所有其他类型,即博客:IBlog 等)。

    并使用 IdentityDbContext 为 Identity 创建单独的项目,其中 MemberIdentiy : IdentityUser, IMember。

    此外,

    由于您的 Domain 有 IMemberRepository、ISomeEntityRepository 等,而 ISomeEntity 有 IMember 属性,您可以在 DAL 中分别实现 SomeEntityRepository 和 Identity 项目中的 MemberRepository。

    您可以决定两个上下文是否使用相同的数据库。

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2014-03-10
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2019-01-31
      • 2015-07-21
      相关资源
      最近更新 更多