一方面,不变量应该受到保护(使无效状态在早期变得不可能,最好是在编译时而不是运行时(,另一方面,将域知识传出域是错误的。
一方面,值对象首先保护我们的域不变量,另一方面,将它们用作命令或其属性等于传递域知识。
保护不变量和避免域知识泄露域边界(封装域模型(的唯一解决方案似乎是将聚合封装在命令到值对象映射器中。
我正在使用CQRS和ES.
在我的聚合根周围有一个包装器作为命令来赋值对象映射器可以吗?还有其他解决方案吗?
值对象可以具有约束,例如整数上的有效范围或字符串上的正则表达式。如果这些约束得到了验证,并且值在同一个编译代码边界中传递,那么应该是可以的。如果在另一个边界中验证值,然后在反序列化后接受它为有效,那么这将是泄漏的。
命令只是表达意图。在处理与当前域状态相关的命令时,将验证其值。域值是创建的,既可以在内部验证自身,也可以由其他域逻辑验证。