【发布时间】:2021-12-22 04:00:41
【问题描述】:
我在我的应用程序中使用非常基本的事件溯源技术,但是我遇到了一个概念问题。让我们直接进入示例。
ProductAggregateRoot.php
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;
}
现在,我想创建一些其他方法(甚至域服务,并不重要),这很简单:
- 从外部来源获取当前价格和可用性
- 尝试更新汇总价格。
- 尝试更新总体可用性。
如您所见,在更新价格时,我正在检查一些业务不变性,例如,如果产品不可用,您无法更改价格,如果其价值未发生变化,您无法更改价格。如果任何不变量被破坏,则抛出异常。
现在,在我的域服务中,我想根据外部数据源更改价格和可用性。现在,我只是做了一些 try catch 块,如下所示:
try {
$aggregate->changePrice(new ChangeProductPrice(
$productId,
$state->getPrice()
));
} catch (CannotChangePriceException $ex) {
}
一个用于价格的 try-catch 块,另一个用于可用性等。它有效,但我觉得它完全是错误的和hacky。我会更喜欢简单的 if 块和方法/规范,如CanChangePrice()。但是,我需要双重使用它——无论是在服务中还是在具体方法本身,这听起来也不好。
问题是:你们如何处理这些事情?这似乎是一个非常微不足道的问题,但我仍然没有找到让我感觉良好的解决方案。
【问题讨论】:
标签: php domain-driven-design event-sourcing