特别是在玩DDD和Value对象时,我遇到了一些问题。
VOs在构造函数\fabric方法中隐藏验证逻辑,允许我们依赖于对象始终处于一致状态这一事实。因此,在我们使用电话号码的所有地方都不需要显式验证,这些电话号码本来可以用字符串来表示。
因此,不会从错误的输入数据构造任何对象。或者我们可以创建一个特殊的“无效”VO。但我认为这是一种倒退,因为每当我们处理这个问题时,我们都会被迫检查它的有效性。
我的问题是,当业务逻辑发生变化,但数据库中存储的数据没有变化时,我们应该做什么。一直以来,我们都能够接受来自用户输入的数字、下线和括号的任何组合,作为有效的电话号码。但在某些时候,验证逻辑已被更改为更严格:有效的电话号码应该只以+1开头,缩小到美国号码。
我们不能在从DB创建VO PhoneNumber时引发异常,因为它不允许UI填充用户可以修复的数据。此外,我们无法从无效数据创建VO,因为这将消除始终处于一致状态的好处,并使我们回到原来的位置,因为我们一直在检查输入数据。
有什么方法可以允许我们使用VOs而仍然能够读取无效的数据(根据旧的规则是有效的,而这些数据已经消失了)?可能是某种版本的VOs?当新的业务逻辑到达时,我们不是改变旧的VO,而是创建(继承)新的?还是别的什么?无论它是什么,我认为它不应该放弃能力的VO永远是一致的。
谢谢。
发布于 2019-12-12 09:30:59
我们不能在从DB创建VO PhoneNumber时引发异常,因为它不允许UI填充用户可以修复的数据。此外,我们无法从无效数据创建VO,因为这将消除始终处于一致状态的好处,并使我们回到原来的位置,因为我们一直在检查输入数据。
听起来你不使用CQRS,否则这根本不是问题。
在CQRS中,您可以将命令(以及数据模型)拆分为查询和命令,其中命令对数据进行变异(=对聚合进行操作),而查询则在读取模型(聚合数据的投影)上操作。
对于不需要验证的查询,它只是投影数据的一种形式(也就是说,您可以查询它或使快速读取访问w/o被阻止,从而阻止对命令的变异操作)。
如果在两个单独的模型(读和写模型)中正确地应用CQRS,仍然可以读取“无效”数据。但是,对此数据的任何更改都必须遵守新的业务规则。
https://stackoverflow.com/questions/59297805
复制相似问题