0

我在这里简化了问题以缩小焦点:

当需要来自存储库的数据时,有哪些推荐的方法可以在域层中执行实体构造验证?

例如,考虑在创建实体之前需要通过以下验证规则:

规则 1:申请手机的员工必须在 ABC 公司工作 6 个月或更长时间

域层中实体可用的信息源自 UI,后来从应用层中的订单服务传入,没有足够的信息来执行上述示例规则。需要从存储库中查询以返回员工的雇用日期,以计算他们是否工作了 6 个月或更长时间。

问题

问题是此时应该联系存储库的哪个层或服务以获取验证规则 1 所需的员工雇用日期?除非规则 1 通过并且实体的其他数据值也通过,否则域实体不被视为有效。

提前致谢。

4

1 回答 1

0

对存储库的调用以获取 OrderValidationData 应该在应用程序服务中还是应该在域层中。

域验证,因此,它应该是域内服务的一部分。

您只需要想象与某个域交互的应用程序服务,在该域中,该域正在处理的数据没有通过域本身的验证来强制执行。这是非常危险的,因为如果某些应用程序服务不执行所谓的验证,那么域可能会被破坏!

如果它在域层中,那么我想我将不得不注入调用 OrderValidationData 所需的存储库实例?此外,由于我读过人们不会将存储库操作添加到实体中,因此我必须创建一个域服务来执行存储库操作。

富域模型贫血域模型(请参阅富域模型与贫血域模型

那么如何在存储库中验证您的域呢?如果您已经实现了ProductRepository,我相信您最好的选择是在要添加或更新域对象时验证它们。也就是说,所有上层都必须强制遵循存储库的规则,这意味着您已将破坏域模型的机会减少到零。

顺便说一句,我会将这些验证实现为规范(请参阅规范模式),因此您可以在域对象被存储库持久化之前在某些操作的早期阶段验证您的域。您可能需要在相同的操作中验证相同的域对象,并且规范是在 n 层架构中重用验证规则的好朋友。

于 2016-03-04T22:33:06.783 回答