【问题标题】:What is the difference between IEditableObject and IRevertibleChangeTracking?IEditableObject 和 IRevertibleChangeTracking 有什么区别?
【发布时间】:2011-02-27 08:38:19
【问题描述】:

IEditableObjectIRevertibleChangeTracking(均来自 System.ComponentModel 命名空间)有什么区别?看起来第一个支持显式事务,而第二个更隐式 - 但最终结果是相同的。我应该如何在代码中实现这一点?目前我在BeginEdit 中什么都不做,分别在EndEditCancelEdit 中调用RejectChangesAcceptChanges。我的问题是这也将接受在 BeginEdit 之前所做的更改。

这真的是 Microsoft 想要的,还是我试图实现两个互斥的接口?

【问题讨论】:

    标签: c# .net vb.net system.componentmodel componentmodel


    【解决方案1】:

    IEditableObject 用于短期的、可恢复的修改,例如对话框。

    IRevertibleChangeTracking 用于长期、可恢复的更改,例如编辑记录和跟踪记录是否需要保存。

    我经常实现这两个接口,以便能够支持两个级别的撤消。

    【讨论】:

      【解决方案2】:

      这两个接口不是互斥的。它们只是为了支持不同但有些相关的场景,这些场景也可以由同一个给定类实现。这里有一个简单的解释:

      IEditableObject 接口

      IEditableObject 接口旨在支持对象在编辑时需要以某种特定方式管理其内部状态的场景。

      因此,接口包含显式标记编辑阶段何时开始、完成或中止的方法,以便可以在这些阶段采取适当的操作来修改对象的状态。


      IRevertibleChangeTracking 接口

      IRevertibleChangeTracking 接口旨在支持对象需要能够回滚到其先前状态的场景。

      接口具有标记对象的当前状态何时应永久化或应恢复到最后已知的永久状态的方法。

      【讨论】:

      • +1:您是否知道有关这些接口的任何已知实现的任何细节或任何使用它们的建议方法? MSDN 在这里非常不完整,谷歌也没有返回更多内容。
      • ADO.NET 中的一些核心类是有趣的例子。 System.Data.DataRow 类公开了 AcceptChanges/RejectChanges 和 BeginEdit/CancelEdit/EndEdit 方法(尽管没有实现上述任何接口)。 BeginEdit 方法将一行置于暂停事件和验证的状态,直到调用 CancelEdit 或 EndEdit。除此之外,CancelEdit 还调用 RejectChanges,它通过将行恢复为之前的值来撤消所有修改。 EndEdit 改为调用 AcceptChanges,它会用当前值覆盖以前的值。
      • 谢谢。顺便说一句,你的博客刚刚有了一个新读者。真的很好。
      • @SnOrfus 谢谢,我很感激 :-)
      • 2020 年 Google 员工注意:代码审查 上提到了 here 的一项相当不错的联合工作。
      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多