聚合来自两个不同数据库上下文的数据

问题描述

我有两个数据库上下文。

首先:ASP.NET 身份上下文。

public class IdentityContext : IdentityDbContext<IdentityAppUser>
{
    public IdentityContext(DbContextOptions options)
        : base(options)
    {
    }
}

身份用户

public class IdentityAppUser : IdentityUser
{
}

第二:DatabaseContext。

public sealed class DatabaseContext : DbContext
{
    public DatabaseContext(DbContextOptions<DatabaseContext> options)
        : base(options)
    {
    }

    public DbSet<User> Users { get; set; }
}

用户。包含身份用户 ID。

public class User : BaseEntity
{
    public string IdentityId { get; set; }
}

我正在使用 CQRS。我想返回完整的用户数据(身份信息 + 域模型信息)。所以我正在考虑实施。

  1. 保留两个单独的查询。第一个查询返回域用户,第二个返回身份用户。然后在API层合并查询结果。

  2. 为此目的保留单个查询。在应用层保留完整的用户模型。在查询处理程序中将域和身份用户合并到完整模型中。

  3. 将域用户移至基础设施层。创建包含完整用户信息的新域用户模型。保留单个查询以返回完整的用户数据。在查询处理程序中合并数据库用户模型(旧域用户)和身份用户

哪种方法更好?

解决方法

我认为这个问题最终与从同一数据库返回两个查询的结果非常相似。结果需要在某处合并。有时是存储库,有时是服务层,有时是客户端代码对后端进行两次调用以创建单个页面。

在何处合并数据没有普遍的正确响应。有时可能很清楚(来自两个相关表的数据 => 在 SQL 中执行),有时则不太清楚。

请记住,整个解决方案中可能会使用实体(在本例中为用户)的多个视图,并且这些视图可能与应用程序不同层中的其他数据相结合。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...