gpt4 book ai didi

c# - 同步多个 View 、编辑器和提交/取消

转载 作者:行者123 更新时间:2023-11-30 18:42:18 27 4
gpt4 key购买 nike

我们正在考虑一种架构,以支持对同一对象的多个 View 和编辑器。一个要求是提交或取消对整个对象所做的更改的可能性。

我们的要求是- 同时编辑大量对象(在多选模式下最多 10.000 个)- 同时有多个 View 和编辑器- 编辑器对对象的更改应该只在成功提交后反射(reflect)在其他 View 中- 编辑器中的对象作为一个整体应该是可提交/可取消的

我们已经了解了几个概念,包括动态包装方法 ( http://www.codeproject.com/KB/cs/dynamicobjectproxy.aspx#EditableProxy%28implementingIEditableObject%299 ),我们已经放弃了,因为- 没有动态智能感知- 没有动态编译时检查- 在遍历属性时访问属性(例如对于属性网格)非常昂贵

我们实现了图中的architectur原型(prototype)

每个编辑器都有自己的原始对象的克隆。然后它可以对其进行处理、验证并将其提交到 imodelrepository 中。这样做时,原始对象会更新,并且会为每个克隆发送一个 backendchanged 事件。其他编辑器的 View 模型注册了后端更改事件,现在获得新的克隆以反射(reflect)更改

积极的方面是:- imodelrepository 只输出克隆,禁止直接编辑原始文件- 每个编辑器都可以在自己的克隆上工作- 如果一个编辑提交更改,有一种方法可以通知其他克隆并更新那里的内容但消极方面是:- 每个编辑器/查看器 View 模型都必须查找在原始对象发生更改时发送的后端更改对象。然后它需要获得一个新的克隆并丢弃旧的- 此外,如果另一个编辑器删除了对象,则每个编辑器/查看器都必须查找对象删除事件。然后它需要丢弃它的克隆- 需要大量克隆,这会降低系统速度,尤其是对于同时编辑的大量对象

我们正在考虑将原件交给仅注册为查看器的 View 模型,并为真正的编辑器使用克隆。这将减少所需的克隆数量。但是没有办法保证给观众一个只读的原件(动态只读包装器会导致和上面提到的editableproxy一样的问题)

对于如何简化方法或不同架构的任何输入或想法,我将不胜感激

谢谢

Synchronizing multiple Views

最佳答案

  • 如果可以同时打开同一个模型对象之上的多个编辑器,
    然后等待提交更新其他人将违反直觉(*),
    在这种情况下,我将为他们所有人使用相同的 VM,并让他们也编辑处于中间状态的对象,并使用全局提交来根据 VM 的更改更新存储库。

  • 如果不能同时打开同一模型对象上的多个编辑器,
    那么一次一个 VM(每个模型对象)应该可以。
    您可以使用 T4s 为查看器生成只读 VM 类,它与原始 VM 类相同,只是没有属性 setter 。

(*) 例如使用可以更新名称,其他查看器/编辑器仍会显示旧名称,用户可以在两个不同的编辑器中将名称编辑为两个不同的值而无需提交。
如果提交了一个编辑器的更改,则在重新克隆期间可能会丢失其他编辑器中的更改。

  • 另一种方法是为所有查看者提供一个只读 VM(可以从编辑器的 VM 生成 T4),
    允许多个编辑器更新同一个模型对象,在存储库中使用基于时间戳的并发(乐观并发),并继续为每个编辑器提供单独的 VM。
    更改将在提交时提供给存储库,已经打开的编辑器在尝试提交之前不会知道更改。
    当他们尝试提交时,如果模型对象已被编辑,将抛出异常(例如 EF 中的 OptimisticConcurrencyException),您可以捕获该异常以使用户能够使用react(丢弃、覆盖、合并)。

关于c# - 同步多个 View 、编辑器和提交/取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com