gpt4 book ai didi

language-agnostic - 使用 DDD 和 CQRS 处理域逻辑的重复

转载 作者:行者123 更新时间:2023-12-04 01:07:11 30 4
gpt4 key购买 nike

我正在试验 DDD + CQRS,但我无法理解如何处理这个域逻辑重复问题:

首先,关于跨域重复:

场景一:
假设我有一些处理办公室员工的应用程序。我有 3 个有界上下文:程序员部门、QA 部门和审计部门。每个 BC 都有自己的 AR:“程序员”、“测试员”、“ worker ”。它们有 99% 的不同,每个都有不同的逻辑,但是,每个都有“姓名”、“姓氏”和一个简单的方法“getFullName”,它将这两者连接起来。

问题一:我如何(并且应该?)使通用方法不会在每个 AR 中重复?

最简单的答案可能是创建一些共享的“Human”类,并使这 3 个 AR 从中派生,但这与 DDD 的想法背道而驰,因为“QA 部门”永远不需要“getFullName”方法,但需要其他一些“共享” ”的方法。因此,此解决方案将使域中使用未使用的方法成为垃圾邮件。

现在关于 CQRS 代码重复:

场景二:数据库包含发票。每张发票都有字段“sum”和“tax”。在“显示发票”页面中,我需要显示含税的发票金额。因此,在我的阅读模型中,我需要执行“total = sum + tax”以将其显示给最终用户。但是,用户可以按“批准”按钮,比方说,这应该在其他数据库(会计或其他)中注册发票金额。所以,在我的写模型中,我将再次需要做“total = sum + tax”。

问题2:我如何(我应该如何?)删除这种重复?

当然,这是一个简单的场景,但在分析了我的一些现实生活应用程序后,我发现使用 CQRS 需要在不同的地方进行大量的大量重复,因为有很多地方最终结果是从存储在数据库中的数据计算出来的,这在查询和命令操作上都完成。

有什么想法吗?我错过了什么吗?

最佳答案

场景一

  • 将代码复制并粘贴到三个有界上下文中的每一个中。
  • 为包含在共享库中的名称创建一个值对象,该库封装了获取全名的逻辑。
  • 创建一个 Employee 有界上下文,负责管理员工详细信息。任何额外的有界上下文都可以使用它来查找员工的详细信息。将发布事件以确保有界上下文之间的一致性(例如 EmployeeJoinedCompanyEvent 包含其全名)。

  • 场景二

    任何计算都应该是域模型的一部分。包含在实体、值对象或域服务中。

    任何计算的结果 - 在本例中为总计 - 然后包含在从域发布的事件中。读取和写入数据存储都可以根据已发布事件中包含的值进行更新。他们不应该自己做任何计算。

    例如,如果域发布了 InvoiceApprovedEvent它将包含读取模型所需的所有数据。包括总税额和总金额。

    事件也是有界上下文之间集成的主要手段。因此,如果您需要更新会计有界上下文或外部系统,则可以从发票有界上下文订阅相关事件,并在接收到事件时对其进行处理。

    引用文献

    我强烈推荐一些用于实现 DDD 和 CQRS 的资源(假设您已经熟悉 Eric Evan 的 DDD 书籍)。
  • Microsoft 模式与实践 - Exploring CQRS and Event Sourcing (免费电子书)
  • Implementing Domain-Driven Design作者 Vaughn Vernon(付费书)
  • 关于language-agnostic - 使用 DDD 和 CQRS 处理域逻辑的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010902/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com