Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同步多个视图、编辑器和;提交/取消_C#_Architecture_Mvvm_Synchronization_Editor - Fatal编程技术网

C# 同步多个视图、编辑器和;提交/取消

C# 同步多个视图、编辑器和;提交/取消,c#,architecture,mvvm,synchronization,editor,C#,Architecture,Mvvm,Synchronization,Editor,我们正在考虑一种架构,以支持同一对象上的多个视图和编辑器。需求是提交或取消对整个对象所做更改的可能性 我们的要求是 -同时编辑的对象批次(在多选模式下最多10.000个) -同时使用多个视图和编辑器 -在成功提交后,对象上的on editor中的更改只应反映在其他视图中 -编辑器中的对象作为一个整体应该是可提交/可取消的 我们已经了解了几个概念,包括动态包装器方法(),因为 -动力学上没有智能感知 -动态上没有编译时检查 -在属性上进行迭代时(例如,对于属性网格),访问这些属性的成本非常高 我们

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

我们的要求是 -同时编辑的对象批次(在多选模式下最多10.000个) -同时使用多个视图和编辑器 -在成功提交后,对象上的on editor中的更改只应反映在其他视图中 -编辑器中的对象作为一个整体应该是可提交/可取消的

我们已经了解了几个概念,包括动态包装器方法(),因为 -动力学上没有智能感知 -动态上没有编译时检查 -在属性上进行迭代时(例如,对于属性网格),访问这些属性的成本非常高

我们已经在图中实现了architectur的原型

每个编辑器都有自己的原始对象克隆。然后,它可以对其进行处理、验证并将其提交到imodelrepository中。执行此操作时,将更新原始对象,并为每个克隆发送backendchanged事件。其他编辑器的viewmodels为backendchanged事件注册,现在获得新的克隆以反映更改

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

我们正在考虑将原件交给仅注册为查看器的viewmodels,并将克隆用于真正的编辑器。这将减少所需的克隆数量。但是,没有办法确保查看器具有只读的原始版本(动态只读包装器会导致与上面提到的editableproxy相同的问题)

对于如何简化该方法或关于不同体系结构的任何意见或想法,我将不胜感激

thx

  • 如果可以同时打开同一模型对象上方的多个编辑器,
    然后等待提交以更新其他内容将是违反直觉的(*),
    在本例中,我将对所有对象使用相同的VM,让它们也在中间状态下编辑对象,并使用全局提交来根据VM的更改更新存储库

  • 如果无法同时打开同一模型对象上方的多个编辑器,
    然后一次一个VM(每个模型对象)就可以了。
    您可以使用T4s为查看器生成一个只读VM类,该类与原始VM类相同,只是没有属性设置器

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

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

编辑器是由同一用户/机器使用还是远程使用。您希望以多快的速度反映更改?-每个字段更改或仅提交?编辑器都在同一台机器上。我们的系统只在提交上反映更改就足够了。立即反映更改和删除提交也可以吗(使用撤消选项)?提交选项是我们的pm明确希望的,我认为他们不想放弃它。此外,在编辑时,编辑的对象可能处于无效状态(我们使用IDataErrorInfo概念来传播验证更改),并且只有在其处于有效状态时,用户才能将其提交到数据库。但是任何方法都是受欢迎的,如果您有链接或想法,请告诉我们,也许我们可以使用其中的一部分来解决问题。谢谢你的意见。我将尽快研究t4代码生成,直到现在我们才与之有任何关系。因为我们不能保证每个对象只打开一个编辑器,所以您的第二种方法可能是我们要采用的方法。