【问题标题】:DDD & Event Sourcing: expiration as specification or command?DDD 和事件溯源:到期作为规范还是命令?
【发布时间】:2018-10-22 05:02:31
【问题描述】:

背景

我正在尝试将 ddd 和事件溯源应用到我的部分项目中。

这是一个拍卖应用程序。

  • Customer注册ItemAuctionSTARTED当管理员approvesItem
  • Auction 具有 duration,它允许 BidderBidduration 内。
  • Auction 被视为 ENDED,之后 durationBidder 无法出价。
  • maximum bids limit 遇到时Auction 也是ENDED,即使duration 没有通过。
  • Customer 可以在duration5 days after the duration ends 中使用select 一个Bid
  • 之后,我们认为AuctionEXPIREDCustomer 不能selectBid

申请要求:

  • Bidder 应该能够查询可竞价拍卖。
  • 应该只发送一次endedexpired 拍卖的通知。

总而言之,我定义了我的经典 DDD 领域模型:

实体:AuctionBidCustomerAdministratorBidder

值对象:AuctionStatusSTARTEDENDEDEXPIREDSELECTED

聚合根:AuctionCustomerBidderAdministrator


问题

问题是我不确定我是否应该这样做

A) 定义一个类似AuctionEndedSpecification的规范,并用它来查询和判断状态和约束动作。

B) 将EndAuction 视为命令并将简单属性status 放入Auction

A 的棘手部分:要判断拍卖是否过期或结束,我需要当前时间,这使得代码更难实现。而且我认为实现查询端可能更难。

B 的棘手部分:拍卖因多种原因而结束(当持续时间已过时,当遇到最高出价限制时)。我了解到让一个事件触发另一个事件并不是一个好习惯。但在这种情况下,BidAdded 事件可能会触发AuctionEnded 事件。此外,如果我使用计划任务管理到期,感觉就像我的域模型假设读取端的简单性与应用程序要求高度相关。

如果你遇到过类似的问题,请帮我谈谈你的经验。

【问题讨论】:

    标签: domain-driven-design cqrs event-sourcing


    【解决方案1】:

    看起来您的拍卖聚合的状态显然可以从事件中计算出来,而无需任何额外的事件。在写入端和读取端。

    您仍可能希望添加 AuctionEnded 事件的原因是:

    • 未来竞价规则可能会发生变化,你的计算逻辑会变得很复杂。

    • 您有一个不想自己计算拍卖结束状态的外部服务。

    • 一般建议您的聚合事件流应该由领域专家读取。我想我希望在这样的流中看到“AuctionEnded”标记。

    如果您决定生成 AuctionEnded 事件,则需要 Saga/ProcessManager 在适当的时间发出“EndAuction”命令。

    【讨论】:

      【解决方案2】:

      要判断拍卖是过期还是结束,我需要当前时间,这使得代码更难实现。

      我请你注意John Carmack的写作

      如果您不将时间视为输入值,请考虑直到您这样做 - 这是一个重要的概念

      我要澄清一下,它是放在 域模型中的;通常不需要将时钟推到应用程序边界之外。

      选择采用哪种方法的一个关键概念是域模型是决定拍卖何时结束的权威,还是只是跟踪其他地方做出的决定?

      您的第一种方法与模型是权威的想法一致;应用程序告诉模型现在几点了,模型决定是否结束拍卖。

      您的第二种方法与模型只是记账的想法一致 - “结束拍卖”来自 模型之外。

      任何一种方法都可能是“正确的”,具体取决于您正在构建的内容。

      鉴于您的其余描述,我认为您正在尝试构建第一种类型的解决方案,因此您应该考虑告诉域模型现在是什么时间,并让模型决定是否这样做表示拍卖结束。

      警告:管道正确可能会很痛苦:应用程序如何知道哪些拍卖需要时间?重新启动应用程序时计划是否仍然存在?等等。

      【讨论】:

        猜你喜欢
        • 2013-01-24
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多