【发布时间】:2021-04-19 13:50:28
【问题描述】:
我正在构建一个集成Plaid API 以访问用户银行信息(登录、帐户、交易等)的应用程序。我正在尝试遵循 DDD 原则。
以下是 Plaid API 流程如何工作的一般概念:
- 用户提供了他的电子邮件/密码,用于某些银行机构。如果有效,则会创建一个格子 Item。此对象将用户与一组银行凭证相关联,并包含一个访问令牌,可用于进一步与 API 交互。
- 每个格子 Item 都可以访问一组特定的银行 Accounts。
- 每家银行账户都有一组交易
到目前为止,我在域层中创建了 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;
...
}
如您所见,这些实体之间的关系是:
用户 HAS 项目 -> 项目 HAS 帐户 -> 帐户 HAS 交易
我的问题是,当我需要通过间接父级查找实体时会发生什么?例如:GetTransactionsByItemId 或 GetAccountsByUserId。基于DDD,这个逻辑应该去哪里?
由于我的数据的结构方式(一对多关系的 No-SQL 链),我知道我必须分多个步骤执行此类查询。但是,我读过 Repository 应该只关心它自己的实体,所以我怀疑将 ItemsRepository 和 AccountsRepository 注入 TransactionsRepository 以添加 GetTransactionsByItemId 方法可能不是一个好主意。 p>
我还阅读了有关将许多存储库注入服务并从内部管理所有这些“连接”的信息。但是,我想不出这个服务的名字,所以我担心这是因为从概念上讲这没有多大意义。
我还阅读了有关聚合的信息,但我不确定我是否识别出这些实体中的根。
我能想到的另一个选择是尝试通过向每个事务添加 ItemId 来缩短关系。但是,由于我从 api 获取数据的方式,这将是一个 hack。
【问题讨论】:
标签: .net-core nosql domain-driven-design ddd-repositories ddd-service