如果使用不存储更改的实体调用 Update 会发生什么?
我认为你希望这是一个无操作。
使用持久性支持的存储库looks something like的常用模式
final Cargo cargo = cargoRepository.find(trackingId);
cargo.assignToRoute(itinerary);
cargoRepository.store(cargo);
此代码位于应用程序组件中;存储库和 Cargo 聚合根是允许领域模型了解的抽象。实现的细节在其他地方。
谜语:如果cargo.assignToRoute 在当前状态下是无操作的,会发生什么? 应用程序 无法知道这一点,因为它无权访问底层状态。它调用了模型,模型决定不更改任何内容,因此存储库会找到存储中可用的相同状态。
这很重要,因为如果您的邮件是通过不可靠的传输方式(如网络)发送给您的,您可能会收到两份相同的邮件。如果领域模型识别出新行程与旧行程相同,则无需更改任何内容。
final Cargo cargo = cargoRepository.find(trackingId);
cargo.assignToRoute(itinerary);
cargoRepository.store(cargo);
final Cargo cargo = cargoRepository.find(trackingId);
cargo.assignToRoute(itinerary);
cargoRepository.store(cargo);
在此流程中引入异常是否真正带来了业务价值?还是我们只是在为自己发明额外的工作?
我们是否真的放置了一堆额外的脚手架来检测以下无害的代码在运行时?
final Cargo cargo = cargoRepository.find(trackingId);
cargoRepository.store(cargo);
思考这里的机制的一种方式:我们不调用模型来使其做任何事情。我们调用域模型是因为我们希望满足特定的post condition。如果模型已经满足后置条件,则无需进行任何更改。
这种模式是典型的idempotent receivers;例如,HTTP PUT 方法是为承诺 idempotent semantics 的操作保留的。
(更准确地说,您提出了一个precondition——调用者确保两个状态不同——调用该方法必须满足该条件。但在这种情况下,前提条件是一个幻像;方法could满足后置条件,只是选择不满足。)