首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventSourcing,Aggregates -使用不变量而不加倍它们

EventSourcing,Aggregates -使用不变量而不加倍它们
EN

Stack Overflow用户
提问于 2021-11-09 12:38:10
回答 1查看 63关注 0票数 0

在我的应用程序中,我正在相当基本的层次上使用事件源技术,但是我遇到了一个概念性问题。让我们直接去做例子吧。

ProductAggregateRoot.php

代码语言:javascript
复制
public function changePrice(ChangeProductPrice $command): self
{
    if ($this->availability->equals(Availability::UNAVAILABLE())) {
        throw CannotChangePriceException::unavailableProduct();
    }

    if ($this->price->equals($command->newPrice)) {
        throw CannotChangePriceException::priceHasntChanged();
    }

    $this->recordThat(
        new ProductPriceChanged($this->price, $command->newPrice)
    );

    return $this;
}

现在,我想创建一些其他方法(甚至域服务,其实并不重要),这些方法很简单:

  1. 从外部源
  2. 获取当前价格和可用性,尝试更新聚合价格。
  3. 尝试更新聚合上的可用性。

正如您所看到的,在更新价格时,我正在检查一些业务不变的内容,例如,如果产品不可用,您不能更改价格;如果产品的价值没有变化,您就不能更改价格。如果任何不变量被破坏,则抛出异常。

现在,在我的域服务中,我希望基于外部数据源更改价格和可用性。现在,我只是尝试了一些捕捉块,如下所示:

代码语言:javascript
复制
try {
    $aggregate->changePrice(new ChangeProductPrice(
        $productId,
        $state->getPrice()
    ));
} catch (CannotChangePriceException $ex) {
}

一个尝试-捕获块的价格,另一个为可用性,等等。这是可行的,但我觉得这是完全错误的和无趣的。如果使用简单的if块和方法/规范(如CanChangePrice() ),我会更舒服。但是,我需要加倍使用它--无论是在服务中还是在具体的方法中,这听起来也不太好。

问题是:你们是如何处理这些事情的?这似乎是一个非常微不足道的问题,但我仍然没有找到一个能让我感觉良好的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 15:32:30

有几个想法:

  • 为什么不使用“更改价格和可用性”命令?这更好地捕捉了更新两者的意图,并允许不变检查具有更好的上下文知识(例如,如果我们将可用性更新为可用,那么当前的可用性就没有意义,因为它是上一次的遗物)。

  • ,我有点怀疑试图将价格更改为当前的价格是否是一个错误。在我看来,这个命令是表达一种愿望,即价格变成期望的价格,所以如果这个愿望已经实现了,为什么要犯错误呢?返回$this (实际上耸耸肩说“确定”)似乎更好,并且不会强迫请求者知道当前的价格(严格地说,他们不能知道这个价格)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69898281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档