DDD如何在不检查持久层的情况下在模型中生成唯一地址?

DDD how to generate unique address in model without checking persistent layer?

我的域中有一个地址模型,它具有一些复杂的地址生成逻辑(想象类似于 IBAN),但由于地址很短,因此可能与数据库中存储的现有地址发生冲突。既然有一种既定的做法,即模型不应该访问存储库,这怎么能实现呢? 我应该在服务层创建一个实例,然后对照存储库检查它吗?

从技术上讲,每个领域用例都是一项服务。当您需要添加新的 Address 时,只需创建对象然后验证是否存在类似的东西。

在您的服务中,您可以使用查询来检查地址是否存在。如果你想让它成为一个存储库方法,那么它意味着 Address 是一个实体。但是,请注意唯一性是一种业务约束,也许它不应该隐藏在存储库中。我更喜欢在 CreateAddress 用例中明确表达。

不过有一个问题,您服务中的所有内容都必须是幂等的。如果应用程序崩溃并且再次处理命令,我们需要能够检测它是否是重复操作。嗯..这听起来很复杂,但是一旦你做了一次就不难了。

就我个人而言,我有一个 'uniques' 存储(恰好使用数据库来确保约束),我在其中放置了一个值,如 [object_type+unique_property] 如果它存在 returns false,如果不存在则将其添加到存储中。它足够通用,可以与任何实体一起使用,而且它也是幂等的。

您可以通过多种方式处理它,但这取决于业务决策,因为总是需要权衡取舍。

通常最简单的解决方案是有一种 AddressGenerationService 会触发 Address 生成,选择结果并查询存储库以检查它是否存在。如果不是 returns 创建的 Address,如果是,它将选择查询返回的那个。这也可以在应用层(这是一种用例)而不是域服务中完成,这取决于您的特定架构。你必须记住,这不是 100% 的防弹。想象一下,有人在您检查之后和保存之前生成了相同的地址。它会崩溃。您必须与商家核实他们将如何处理