c# - 在使用时对域对象进行更改

标签 c# .net mvvm domain-driven-design concurrentmodification

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

  • 用户打开“运行”-窗口(对对象A的只读访问权)
  • 用户打开“编辑”窗口(对对象A的读/写访问权限)
  • 用户更改了UI中的某些属性,但未单击Apply
  • 用户单击“运行”窗口中的“运行”按钮。运行操作应使用“旧”设置执行。
  • 用户单击“编辑”窗口中的“应用”按钮,然后在“运行”窗口中单击“运行”。使用"new"设置执行运行操作。

  • 我可以想到一些解决方案,但是我对其中任何一个都不满意:
  • 从存储库中 checkout 对象时,总是返回一个克隆。如果希望存储更改,则必须将对象显式提交到存储库。这对于小型对象可能效果很好,但是在对象模型很大的情况下,克隆所有内容可能并不合理。
  • View 模型或模型存储中间更改,并且在用户决定应应用更改之前,不会更改基础域对象。这听起来有些乏味,并且将需要我们希望在域对象中使用的 View 模型中的许多验证规则。
  • UI不能直接在域对象上工作。而是,它们更改了当用户应用更改时可以应用于域对象的DTO。

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

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

    最佳答案

    我认为Command pattern可能会对您有所帮助。
    基本上,您将实现“编辑”窗口以不直接在对象上工作,而是创建根据UI中的数据更改对象的命令。单击“应用”后,您将在对象上执行这些命令,将其置于用户选择的状态。

    另一种方法是给“编辑”和“运行”窗口各一个自己的实例,并在用户单击“应用”后“某种程度上”同步“运行”窗口中的对象。但是,我不确定在不引入大量耦合的情况下如何实现此目的。

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

  • 如果不存在任何更改(请参见下文),则其属性 getter 将返回基础域对象的值。
  • 当调用ViewModel的属性 setter 时,该值不会写入域对象,而是写入ViewModel中的相应字段。那是一个变化。从现在开始,ViewModel将返回该值。
  • ViewModel具有将更改写入域对象的方法。该方法不会自动调用,而是在用户单击“编辑”窗口中的“应用”时调用。
  • “运行”窗口中的ViewModel将始终从基础域对象返回数据,因为它永远不会发生更改。
  • 关于c# - 在使用时对域对象进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13525193/

    相关文章:

    .net - WCF的内部限制是什么

    c# - Marketplace 测试套件返回 "Unsupported API cannot be used by background agent"

    c# - 我们可以通过 MVVM 中的 ICommand 获取按钮单击时的按钮属性(如按钮文本、按钮隐藏状态等)吗

    listview - 仅针对xamarin中的特定列表项在listview中隐藏行

    javascript - 无法读取未定义(…)的属性 '_aData' - 数据表

    c# - 仅使用类型的类型制作编译的构造函数表达式

    c# - UpdateProgress 不会在 UpdatePanel 内的每个 PostBack 控件上触发

    c# - ManualResetEvent.WaitOne() 在没有超时的情况下返回 false?

    c# - 如何为 WPF 中的字段制作自定义转换器?

    c# - PBKDF2 和 C# 问题