![]() |
1
37
我喜欢吉米·博加德解决这个问题的方法。他在博客上写了一篇题为 "Entity validation with visitors and extension methods" 其中,他提出了一种非常优雅的实体验证方法,建议实现一个单独的类来存储验证代码。
|
![]() |
2
55
而不是依赖
这基本上意味着,您将从将实体视为纯数据容器,而更多地将其视为具有行为的对象。 以某人的地址为例:
在这些调用之间,您的实体是无效的(因为您的属性不一致)。现在考虑一下:
所有与更改地址行为相关的调用现在都是一个原子单元。您的实体在这里永远不会无效。 如果您采用这种建模行为而不是状态的思想,那么您可以到达不允许无效实体的模型。 有关这方面的讨论,请查看以下InfoQ访谈: http://www.infoq.com/interviews/greg-young-ddd |
![]() |
3
6
我通常使用规范类, 它提供了一种方法(这是C,但您可以用任何语言翻译它):
此方法对候选对象及其关系执行完整的检查。 您可以使用规范类中的参数使其参数化,例如检查级别… 您还可以添加一个方法来了解候选人为什么没有验证规范:
您可以简单地决定实现这样的第一个方法:
对于破坏的规则,我通常编写一个迭代器:
对于本地化,您应该使用资源,为什么不将文化传递给brokenrules方法呢? 我将这些类放在模型名称空间中,名称建议使用它们。 |
![]() |
4
0
多个模型验证应该通过聚合根进行。如果必须跨聚合根进行验证,则可能存在设计缺陷。 我对聚合进行验证的方法是返回一个响应接口,它告诉我验证是否通过/失败,以及有关失败原因的任何消息。 您可以验证聚合根上的所有子模型,使它们保持一致。
|
![]() |
5
-1
这个问题现在有点老了,但如果有人感兴趣,这里介绍我如何在我的服务类中实现验证。 我有个私人的 验证 方法在我的每一个服务类中,它接受一个正在执行的实体实例和操作,如果验证失败,则会引发一个自定义异常,其中包含破坏规则的详细信息。 带有内置验证的示例DocumentService
我喜欢这种方法,因为它允许我将所有的核心验证逻辑放在一个地方,从而使事情变得简单。 |
![]() |
Tony Raimo · 域实体是否应该调用存储库? 7 年前 |
![]() |
Seb · DDD只读存储库返回“值对象” 7 年前 |
![]() |
tlt · 使用嵌套对象和大集合进行聚合根优化 7 年前 |
![]() |
PatrickSJ · DDD,状态对象/值对象 7 年前 |
![]() |
msmani · DDD更改聚合根id 7 年前 |
![]() |
DuskMcDusk · 逻辑和性能中的聚合根冲突 7 年前 |