首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >价值对象与业务逻辑演进

价值对象与业务逻辑演进
EN

Stack Overflow用户
提问于 2019-12-12 04:38:26
回答 1查看 119关注 0票数 1

特别是在玩DDD和Value对象时,我遇到了一些问题。

VOs在构造函数\fabric方法中隐藏验证逻辑,允许我们依赖于对象始终处于一致状态这一事实。因此,在我们使用电话号码的所有地方都不需要显式验证,这些电话号码本来可以用字符串来表示。

因此,不会从错误的输入数据构造任何对象。或者我们可以创建一个特殊的“无效”VO。但我认为这是一种倒退,因为每当我们处理这个问题时,我们都会被迫检查它的有效性。

我的问题是,当业务逻辑发生变化,但数据库中存储的数据没有变化时,我们应该做什么。一直以来,我们都能够接受来自用户输入的数字、下线和括号的任何组合,作为有效的电话号码。但在某些时候,验证逻辑已被更改为更严格:有效的电话号码应该只以+1开头,缩小到美国号码。

我们不能在从DB创建VO PhoneNumber时引发异常,因为它不允许UI填充用户可以修复的数据。此外,我们无法从无效数据创建VO,因为这将消除始终处于一致状态的好处,并使我们回到原来的位置,因为我们一直在检查输入数据。

有什么方法可以允许我们使用VOs而仍然能够读取无效的数据(根据旧的规则是有效的,而这些数据已经消失了)?可能是某种版本的VOs?当新的业务逻辑到达时,我们不是改变旧的VO,而是创建(继承)新的?还是别的什么?无论它是什么,我认为它不应该放弃能力的VO永远是一致的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-12 09:30:59

我们不能在从DB创建VO PhoneNumber时引发异常,因为它不允许UI填充用户可以修复的数据。此外,我们无法从无效数据创建VO,因为这将消除始终处于一致状态的好处,并使我们回到原来的位置,因为我们一直在检查输入数据。

听起来你不使用CQRS,否则这根本不是问题。

在CQRS中,您可以将命令(以及数据模型)拆分为查询和命令,其中命令对数据进行变异(=对聚合进行操作),而查询则在读取模型(聚合数据的投影)上操作。

对于不需要验证的查询,它只是投影数据的一种形式(也就是说,您可以查询它或使快速读取访问w/o被阻止,从而阻止对命令的变异操作)。

如果在两个单独的模型(读和写模型)中正确地应用CQRS,仍然可以读取“无效”数据。但是,对此数据的任何更改都必须遵守新的业务规则。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59297805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档