0

我们有一组域对象,可以在一个窗口中编辑并在另一个窗口中同时使用。确保对象始终处于有效状态,并且更改在提交之前对外界不可见。对象存储在存储库中(每个对象都有一个唯一的 ID)。

  1. 用户打开“运行”- 窗口(对对象 A 的只读访问)
  2. 用户打开“编辑”窗口(对对象 A 的读/写访问权限)
  3. 用户更改 UI 中的某些属性,但未单击应用
  4. 用户单击运行窗口中的“运行”按钮。运行操作应使用“旧”设置执行。
  5. 用户单击编辑窗口中的“应用”按钮并在运行窗口中运行。运行操作使用“新”设置执行。

我可以想到一些解决方案,但我对其中任何一个都不太满意:

  1. 从存储库中检出对象时,始终会返回一个克隆。如果希望存储更改,则必须将对象显式提交到存储库。这可能适用于小对象,但在对象模型很大的情况下,克隆所有内容可能不合理。
  2. 视图模型或模型存储中间更改并且在用户决定应该应用更改之前不会更改底层域对象。这听起来有点乏味,并且需要我们希望在域对象中拥有的视图模型中的大量验证规则。
  3. UI 不能直接作用于域对象。相反,当用户应用更改时,它们会更改可应用于域对象的 DTO。

请注意,只有一个并发编辑器,但可能有多个并发“阅读器”。此外,并发不会成为问题(从某种意义上说,在多线程环境中部分更新了对象)。

在提交更改之前,我们如何实现编辑域对象而不应用更改的模式?有什么我应该研究的框架吗?

4

1 回答 1

3

我认为命令模式可能对您有所帮助。
您基本上会实现您的编辑窗口,使其不直接处理对象,而是创建根据 UI 中的数据更改对象的命令。单击应用后,您在对象上执行这些命令,使其进入用户选择的状态。

另一种方法是给 Edit 和 Run 窗口各自提供它们自己的实例,并在用户单击 Apply 后“以某种方式”同步 Run 窗口中的对象。但是,我不太确定如何在不引入大量耦合的情况下实现这一点。

第三种方法是我将实现的:
当您使用 MVVM 时,编辑窗口和运行窗口都有自己的ViewModel实例。ViewModel 可以保存域对象的实例。两个 ViewModel 都将持有域对象的同一实例的实例。
现在,可以通过以下方式实现 ViewModel:

  1. 如果不存在更改(见下文),则其属性 getter 返回基础域对象的值。
  2. 当调用 ViewModel 上的属性设置器时,值不会写入域对象,而是写入 ViewModel 中的相应字段。那是一个变化。从现在开始,ViewModel 将返回该值。
  3. ViewModel 有一个将更改写入域对象的方法。此方法不会自动调用,它会在用户在编辑窗口中单击应用时调用。
  4. 运行窗口中的 ViewModel 将始终从底层域对象返回数据,因为它永远不会发生变化。
于 2012-11-23T08:34:39.903 回答