问题标签 [ddd-service]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net-core - DDD 通过间接父实体 ID 访问实体
我正在构建一个集成Plaid API以访问用户银行信息(登录、帐户、交易等)的应用程序。我正在尝试遵循 DDD 原则。
以下是 Plaid API 流程如何工作的总体思路:
- 用户为某个银行机构提供他的电子邮件/密码。如果有效,则会创建一个格子项目。该对象将用户与一组银行凭证相关联,并包含一个访问令牌,可用于进一步与 API 交互。
- 每个格子项目都可以访问一组特定的银行帐户。
- 每个银行账户都有一组交易
到目前为止,我在域层中创建了 3 个实体:Item、Account 和 Transaction。我为每个存储库创建了一个包含基本 CRUD 操作的存储库。
如您所见,这些实体之间的关系是:
用户有 项目-> 项目有账户 ->账户有 交易
我的问题是,当我需要通过间接父母找到实体时会发生什么?例如:GetTransactionsByItemId或GetAccountsByUserId。基于DDD,这个逻辑该往哪里走?
由于我的数据的结构方式(一对多关系的 No-SQL 链),我知道我必须分多个步骤进行此类查询。但是,我读过 Repository 应该只关心它自己的实体,所以我怀疑将 ItemsRepository 和 AccountsRepository 注入 TransactionsRepository 以添加GetTransactionsByItemId方法可能不是一个好主意。
我还阅读了有关将许多存储库注入服务并从内部管理所有这些“连接”的信息。但是,我想不出这个服务的名称,所以我担心这是因为从概念上讲这没有多大意义。
我还阅读了有关聚合的信息,但我不确定我是否识别出这些实体中的根。
我能想到的另一个选择是尝试通过向每个事务添加 ItemId 来缩短关系。但是,由于我如何从 api 获取数据,这将需要一个 hack。
c# - 会计系统领域驱动设计
我正在为我正在开发的会计系统遵循 DDD 方法。
有两个部分(见下面的域):
- 创建交易:当现金从 Ledger 转移到客户的帐户或反之亦然,或从一个 Ledger 转移到另一个 Ledger 时,将创建一个交易(AccountingTransaction)作为父级(聚合根)。一笔交易可以是多条腿的,即Transaction(AccountingTransaction) 可以有多个LedgerTransaction 或CashTransaction。
- 核对账户:我需要每天在每个分类帐中匹配贷方和借方。
这是我的域的样子:
- AccountingTransaction 是聚合根。
- LedgerTransaction 和 CashTransaction 是 AccountingTransaction 的子实体。
- AccountingTransaction 将有一个 CashTransactions 和 LedgerTransactions 的列表。
- Ledger 是聚合根。
所以第一部分(创建交易)工作得很好,我被困在如何处理分类帐账户对账上。
问题:为了核对帐户,对于给定的一天,我需要获取属于特定分类帐的所有分类帐交易,其中 ReconciledOn(请参阅域类)为空。然后我需要确保所有借方和贷方的总和为 0 - 如果不是,我需要报告错误。匹配的借方和贷方也可能属于不同的聚合根 (AccountingTransaction)。这也意味着我需要在聚合根 (AccountingTransaction) 之外获取 Ledger 事务,这违反了 DDD,然后可能直接在 LedgerTransactions 表上执行写入操作。
请告知我应该如何处理这个问题。域类中是否存在缺陷?
我感谢您的帮助。
谢谢!
domain-driven-design - 是否有交互式主动工具可以对 DDD(领域驱动设计)中的任何 IT 项目进行建模?
是否有交互式主动工具可以对 DDD 中的任何 IT 项目进行建模?
我看过 eventmodeling.org、eventstorming,我看过所有用于现场研讨会的伟大技术(如果没有现场,他们会使用 miro),但它们仍然是“手动”工具。
是否有任何工具可以指导我识别限界上下文、聚合等?特别是如果我是 DDD 新手?
而且我知道每个领域都是不同的,但是由于剔除它的过程总是相同的,也许这样的工具真的可以提供帮助。
domain-driven-design - 需要帮助改进具有聚合根的设计
我有以下情况:
您需要在它成为商店并获得所有者帐户之前创建一个请求。
所以有一天你注册了一个请求。经理审核并批准您的请求后 2 天,这意味着系统必须创建商店和所有者帐户。
在我的模型中,我认为请求、商店和所有者帐户是 3 个聚合根,但后来我读到我不能在一个事务中更新多个聚合,因为它们可能是(事实上它们是,因为所有者帐户位于外部身份验证服务)在单独的数据库服务器中。
问题是..我仍然有一个请求,当它获得批准时,我需要创建 2 个聚合根,即商店(具有所有商店属性,我只有一些数据不变量,例如联系电子邮件或电话的限制) 和所有者帐户。
然后可以允许一个所有者帐户编辑其他人的商店(如协作者)
我怎么能建模呢?
谢谢!
java - 领域驱动设计,如何实现这种类型的规则
我尝试练习 DDD,但我对我在下面写的这类规则有疑问:
领域层下的类 UserAggregator。
领域层下的存储库接口。
UserRepository/ArchiveUserRepository 使用 spring 数据在基础设施层下实现。
基础设施层下的服务。
我的管理规则说,如果用户名与模式不匹配,则将用户归档到归档表中并将其从用户表中删除。
如您所见,规则(从 //1 到 //3)是写在服务类中而不是我的聚合器中!
这个对吗 ?或者如何管理这个?
domain-driven-design - DDD 聚合性能
我是 DDD 的新手。现在我有一个聚合Team
和实体TeamMember
:
当我执行AddTeamMemberCommand
时,存储库将从MongoDB
.
当团队很大时,这似乎是不可接受的。
我从 google 和 stackoverflow 中找到了以下内容:
- 使用 Id 引用而不是实体
- 延迟加载
- 重新设计聚合
- ……
我不确定哪种解决方案适合我,或者对于这种情况是否有更好、更通用的解决方案?有我可以查看的 GitHub 示例项目吗?非常感谢。
domain-driven-design - AggregateRoot A 验证需要来自 AggregateRoot B 的信息
我在 DDD 世界中很新,我想知道如何处理我有一个聚合根 (AggregateRootA) 需要来自其他聚合根 (AggregareRootB) 的一些信息才能做某事的情况(例如更改聚合根A)。
如果我尝试使用更多真实世界的场景,也许这会更清楚......让我们考虑一个预订系统。在系统中,我们有 Reservation 聚合根和 Resource 聚合根。资源具有可用/不可用状态。系统允许创建预订并向其添加资源(在代码中,当然是通过 Id 引用来完成的)。下一步是接受预订,在这一步中,预订必须检查其所有资源是否都处于可用状态。可以说它不能在添加步骤中完成,或者只是该资源在它已经处于保留状态时改变了它的状态。如何执行此类验证?
我想出了一个解决方案,其中 Reservation 可以访问 ResourceRepository,但我发现不应允许 AggregateRoot 在 DDD 中进行此类访问。
我的第二个想法是将验证转移到 ApplicationService 但对我来说这种验证看起来像域逻辑,所以它应该放在域模型中。
我最后的想法是,也许我应该编写专门的 DomainService 来处理这种情况,但是再次...... DomainService 应该可以访问存储库吗?
microservices - 在 DDD 中设计排行榜分数
围绕这个问题有两个实体,主要是
- 排行榜 - 包含关于类型(最低优先/最高优先)、描述、名称等的信息。
- 得分 - 玩家提交的得分值,其中包含玩家详细信息和得分值
用例:
- 我们需要获取前 10 名的得分
- 对于每月排行榜,我们需要找到前 3 名
域规则:
- 玩家可以提交任意数量的分数
- 排行榜排名需要基于排行榜中定义的类型(最低/最高)
对于这样一个系统
- 排行榜和分数有1对多的关系
- 分数需要有关于玩家信息的信息(这是一个单独的聚合根并且在不同的边界上下文中)
如何在 DDD 中设计它?
场景 1: 排行榜是否将是聚合根并且分数将通过排行榜聚合根添加(对于每个分数)?
查询:
在这里,没有排行榜,分数没有意义,也没有域规则坚持通过排行榜聚合根添加分数。这实际上是一个两难境地,如何处理?
如何获取玩家详细信息以输入分数?我是否需要在域服务中获取玩家详细信息并在添加分数时提供排行榜聚合根?
场景 2:Leaderboard 和 LeaderboardScore 是两个不同的聚合根。
查询:
在计算排名时,我们需要从分数聚合根中获取分数并从排行榜中输入信息并完成用例?
这里的大部分用例服务代码需要在域服务或应用程序服务中?