.net-core - DDD 通过间接父实体 ID 访问实体

标签 .net-core nosql domain-driven-design ddd-repositories ddd-service

我正在构建一个集成了 Plaid API 的应用程序访问用户银行信息(登录、账户、交易等)。我正在尝试遵循 DDD 原则。

以下是 Plaid API 流程工作原理的一般概念:

  1. 用户提供了他的一些银行机构的电子邮件/密码。如果有效,则创建格子 Item。该对象将用户与一组银行凭证相关联,并包含可用于进一步与 API 交互的访问 token 。
  2. 每个格子项目都可以访问一组特定的银行帐户
  3. 每个银行账户都有一组交易

到目前为止,我在我的域层中创建了 3 个实体:项目、帐户和交易。我创建了一个存储库,其中包含每个存储库的基本 CRUD 操作。

public class Item
{
    public string Id { get; set; }
    public string AccessToken { get; set; }
    public string UserId { get; set; }
    ...
}

public class Account
{
    public string Id { get; set; }
    public string ItemId { get; set; 
    ...
}
public class Transaction
{
    public string Id { get; set; }
    public string AccountId { get; set; 
    ...
}

如你所见,这些实体之间的关系是:

用户 拥有 项目 -> 项目拥有 账户 -> 账户拥有 交易

我的问题是,当我需要通过间接父项查找实体时会发生什么情况?例如:GetTransactionsByItemIdGetAccountsByUserId。基于DDD,这个逻辑应该往哪里走?

由于我的数据结构(1-多关系的非 SQL 链),我知道我必须分多个步骤进行此类查询。但是,我读到存储库应该只关心它自己的实体,所以我怀疑将 ItemsRepository 和 AccountsRepository 注入(inject)到 TransactionsRepository 以添加 GetTransactionsByItemId 方法可能不是一个好主意。

我还阅读了有关将许多存储库注入(inject)服务并从内部管理所有这些“连接”的信息。但是,我无法为该服务想出一个名称,所以我担心那是因为从概念上讲这没有多大意义。

我也阅读了有关聚合的内容,但我不确定我是否认识到这些实体中的根。

我能想到的另一个选择是尝试通过向每个交易添加一个 ItemId 来缩短关系。但是,由于我从 api 获取数据的方式,这需要是一种 hack。

最佳答案

我会说您的聚合根将是一个项目。如果我的结构正确,则没有帐户就不能存在没有项目和交易的帐户。所以你可以只使用 ItemsRepository:

public class ItemsRepository
{
  public async Task<Item> GetById(long id, IncludesSpec includes)
  {
    return await this.context.Items
      .Where(c => c.Id == id)
      .Include(c => c.Accounts).ThenInclude(c => c.Transactions)
      .SingleOrDefaultAsync();
  }
}

然后你会得到一个包含所有加载数据的项目。 IncludesSpec 由您决定:它将包含应该制作的包含内容以及应在存储库方法中动态添加的包含内容。

从 .net ef core 5 开始,您可以执行过滤包含,例如 .Include(c => c.Accounts.Where(...)),因此您可以根据您的要求进一步缩小实际包含范围。您可以传递另一个包含此过滤器信息的参数。

您的项目还应该将帐户公开为只读集合(使用 EF 的支持字段)并提供方法 AddAccount() 以便没有人可以将您的 DDD 项目修改为纯实体。

关于.net-core - DDD 通过间接父实体 ID 访问实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65720749/

相关文章:

java - DDD 示例应用程序 - hsqldb 在哪里?

domain-driven-design - DDD 存储库和工厂

.net-core - 从 .NET Core 中的 C# 访问 `.csproj` 属性

database - 将DateTime对象上传到NoSQL数据库时出错

javascript - CouchDB更新文档

spring - 同时使用@Document和@Entity

c# - 更改 MVC 主页登陆页面 : No service for type 'Microsoft.Extensions.DependencyInjection.IServiceCollection' has been registered

c# - 命令行解析器 NUGet 包使简单的示例程序工作

azure - 使用azure devops管道将控制台webjob应用程序部署到包含webapi的azure应用程序服务

go - 在 DDD 中,一个实体和存储库可以从多个表中提取吗?