我们有一组域对象,可以在一个窗口中编辑并在另一个窗口中同时使用。确保对象始终处于有效状态,并且更改在提交之前对外界不可见。对象存储在存储库中(每个对象都有一个唯一的 ID)。
- 用户打开“运行”- 窗口(对对象 A 的只读访问)
- 用户打开“编辑”窗口(对对象 A 的读/写访问权限)
- 用户更改 UI 中的某些属性,但未单击应用
- 用户单击运行窗口中的“运行”按钮。运行操作应使用“旧”设置执行。
- 用户单击编辑窗口中的“应用”按钮并在运行窗口中运行。运行操作使用“新”设置执行。
我可以想到一些解决方案,但我对其中任何一个都不太满意:
- 从存储库中检出对象时,始终会返回一个克隆。如果希望存储更改,则必须将对象显式提交到存储库。这可能适用于小对象,但在对象模型很大的情况下,克隆所有内容可能不合理。
- 视图模型或模型存储中间更改并且在用户决定应该应用更改之前不会更改底层域对象。这听起来有点乏味,并且需要我们希望在域对象中拥有的视图模型中的大量验证规则。
- UI 不能直接作用于域对象。相反,当用户应用更改时,它们会更改可应用于域对象的 DTO。
请注意,只有一个并发编辑器,但可能有多个并发“阅读器”。此外,并发不会成为问题(从某种意义上说,在多线程环境中部分更新了对象)。
在提交更改之前,我们如何实现编辑域对象而不应用更改的模式?有什么我应该研究的框架吗?