清洁架构下视图模型转实体:回存数据丢失的解决方案咨询
清洁架构下Presenter转换视图模型的回存问题
核心结论:必须在视图模型中携带原始实体的ID,同时原始精确数据要在业务/数据层保留,绝对不能依赖视图返回的格式化后数据回存
- 视图模型的唯一职责是适配视图展示需求,
amountLabel这类格式化文本只是给用户看的,不具备业务数据的精度和可靠性,用它回存会直接丢失原始精确值,完全违背数据一致性原则。 - 视图不需要关心原始数据的存储细节,只需要把实体ID和用户的有效输入(比如编辑时的新金额数值)传递给控制器即可。控制器拿到ID后,从数据层获取完整的原始
ExpenseEntity,再结合用户输入完成更新,最后持久化。 - 绝对不要尝试从
amountLabel反解析原始数据:一来格式化操作本身就丢失了精度(比如5.33333变成5.33),二来文本解析容易因为格式变化(比如符号、空格)出现错误,不符合清洁架构中"职责单一、数据流向清晰"的设计原则。
举个标准流程示例:
- 数据层获取原始实体:
{ id: 1, amount: 5.33333, currency: 'dollars' }
- Presenter转换为带ID的视图模型(关键是保留ID):
{ id: 1, amountLabel: '$5.33' }
- 视图展示模型,若用户编辑金额,视图向控制器传递
{ id: 1, newAmount: 6.5555 }(这里的newAmount是用户输入的精确数值,不是格式化文本) - 控制器通过ID从数据层取回原始实体,更新
amount字段为6.5555,再持久化回数据库
内容的提问来源于stack exchange,提问作者Nicolas SEPTIER
相关产品推荐
相关产品推荐

