【问题标题】:DDD, Domain Services and EventsDDD、领域服务和事件
【发布时间】:2019-08-23 03:08:47
【问题描述】:

情况:

为了处理域事件,Jimmy Bogart proposed 一种将事件存储在聚合中的方法。

在我看来,这是一种非常方便的方法。但是,域服务中出现域事件的情况呢?

域服务不应该有状态(无状态)。在这种情况下,理论上,IDispatcher 事件调度器必须被注入到这样一个服务的构造函数中。

问题:

为避免引入事件调度器的域服务,建议的替代方法是正确的:

  1. 将上次操作的事件保存在域服务中。但是,这将违反域服务的无状态原则。
  2. 根据服务方法返回事件列表 操作的结果(在返回方法或其他方式中, 取决于编程语言的能力)。

【问题讨论】:

    标签: events event-handling domain-driven-design ddd-service


    【解决方案1】:

    注意:那篇文章大约是五年前写的。您可能想查看他最近的(更详细的):Life Beyond Distributed Transactions: An Apostate's Implementation

    域服务不应该有状态

    是的 - 由于这个原因,您希望为域服务中的域事件分配责任是非常可疑的。

    您可以使用域服务为聚合计算事件,但存储仍属于聚合结构本身。所以这可能看起来像一个函数(或者,如果您愿意,也可以是域服务上的一个方法),它接受聚合提供的一些参数并返回事件。

    【讨论】:

    • 非常感谢您的回答。让我们考虑以下示例。我们有一个 jwt 令牌。它是一个字符串。 jwt 可以序列化为 JsonWebToken 类。这个类是一个值对象。有一个域服务 JwtValidator,它处理 jwt 的验证。如果 jwt 无效,则应发生 InvalidTokenFound 事件。事件处理程序必须通过 InvalidTokenFound 事件中指定的 tokenId 移除相应的聚合 Token。
    • 我理解正确,JwtValidator 连同验证的结果应该返回 InvalidTokenFound 事件,该事件要么放入聚合中,要么立即传递给 IDispatcher?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2019-07-19
    • 2016-12-06
    • 2013-07-18
    • 2016-11-15
    • 2012-02-04
    相关资源
    最近更新 更多