在我的应用程序中,我正在相当基本的层次上使用事件源技术,但是我遇到了一个概念性问题。让我们直接去做例子吧。
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 {
$aggregate->changePrice(new ChangeProductPrice(
$productId,
$state->getPrice()
));
} catch (CannotChangePriceException $ex) {
}一个尝试-捕获块的价格,另一个为可用性,等等。这是可行的,但我觉得这是完全错误的和无趣的。如果使用简单的if块和方法/规范(如CanChangePrice() ),我会更舒服。但是,我需要加倍使用它--无论是在服务中还是在具体的方法中,这听起来也不太好。
问题是:你们是如何处理这些事情的?这似乎是一个非常微不足道的问题,但我仍然没有找到一个能让我感觉良好的解决方案。
发布于 2021-11-09 15:32:30
有几个想法:
,
$this (实际上耸耸肩说“确定”)似乎更好,并且不会强迫请求者知道当前的价格(严格地说,他们不能知道这个价格)。https://stackoverflow.com/questions/69898281
复制相似问题