C# 同步多个视图、编辑器和;提交/取消
我们正在考虑一种架构,以支持同一对象上的多个视图和编辑器。需求是提交或取消对整个对象所做更改的可能性 我们的要求是 -同时编辑的对象批次(在多选模式下最多10.000个) -同时使用多个视图和编辑器 -在成功提交后,对象上的on editor中的更改只应反映在其他视图中 -编辑器中的对象作为一个整体应该是可提交/可取消的 我们已经了解了几个概念,包括动态包装器方法(),因为 -动力学上没有智能感知 -动态上没有编译时检查 -在属性上进行迭代时(例如,对于属性网格),访问这些属性的成本非常高 我们已经在图中实现了architectur的原型 每个编辑器都有自己的原始对象克隆。然后,它可以对其进行处理、验证并将其提交到imodelrepository中。执行此操作时,将更新原始对象,并为每个克隆发送backendchanged事件。其他编辑器的viewmodels为backendchanged事件注册,现在获得新的克隆以反映更改 积极方面包括: -imodelrepository仅输出克隆,禁止直接编辑原始版本 -每个编辑器都可以处理自己的克隆 -有一种方法可以在一个编辑器提交更改时通知其他克隆并更新其中的内容 但消极方面是: -每个编辑器/查看器viewmodel都必须查找在原始对象发生更改时发送的后端更改对象。然后它需要获得一个新的克隆并丢弃旧的克隆 -此外,如果另一个编辑器删除了对象,则每个编辑器/查看器必须查找对象删除事件。然后它需要放弃它的克隆 -需要大量克隆,这会降低系统的速度,尤其是对于同时编辑的对象上的大量克隆 我们正在考虑将原件交给仅注册为查看器的viewmodels,并将克隆用于真正的编辑器。这将减少所需的克隆数量。但是,没有办法确保查看器具有只读的原始版本(动态只读包装器会导致与上面提到的editableproxy相同的问题) 对于如何简化该方法或关于不同体系结构的任何意见或想法,我将不胜感激 thxC# 同步多个视图、编辑器和;提交/取消,c#,architecture,mvvm,synchronization,editor,C#,Architecture,Mvvm,Synchronization,Editor,我们正在考虑一种架构,以支持同一对象上的多个视图和编辑器。需求是提交或取消对整个对象所做更改的可能性 我们的要求是 -同时编辑的对象批次(在多选模式下最多10.000个) -同时使用多个视图和编辑器 -在成功提交后,对象上的on editor中的更改只应反映在其他视图中 -编辑器中的对象作为一个整体应该是可提交/可取消的 我们已经了解了几个概念,包括动态包装器方法(),因为 -动力学上没有智能感知 -动态上没有编译时检查 -在属性上进行迭代时(例如,对于属性网格),访问这些属性的成本非常高 我们
- 如果可以同时打开同一模型对象上方的多个编辑器,
然后等待提交以更新其他内容将是违反直觉的(*),
在本例中,我将对所有对象使用相同的VM,让它们也在中间状态下编辑对象,并使用全局提交来根据VM的更改更新存储库 - 如果无法同时打开同一模型对象上方的多个编辑器,
然后一次一个VM(每个模型对象)就可以了。
您可以使用T4s为查看器生成一个只读VM类,该类与原始VM类相同,只是没有属性设置器
如果提交了一个编辑器的更改,则在重新调整期间其他编辑器中的更改可能会丢失
- 另一种方法是为所有查看器提供一个只读VM(可以从编辑器的VM生成T4),
允许多个编辑器更新同一模型对象,在存储库中使用基于时间戳的并发(乐观并发),并继续为每个编辑器提供单独的VM。
更改将在提交时馈送到存储库,已打开的编辑器在尝试提交之前不会意识到更改。
当他们尝试提交时,如果模型对象已被编辑,则将抛出异常(例如EF中的OptimisticConcurrencyException),您可以捕获该异常以使用户能够对其作出反应(disgard、overwrite、merge)