IEditableObject和IRevertibleChangeTracking之间有什么区别?

26
IEditableObjectIRevertibleChangeTracking(均来自System.ComponentModel命名空间)之间有什么区别?看起来第一个支持显式事务,而第二个更加隐式 - 但最终结果是相同的。在代码中如何实现这个功能?目前我在BeginEdit中什么都不做,在EndEditCancelEdit中分别调用RejectChangesAcceptChanges。我的问题是,这样做也会接受在BeginEdit之前所做的更改。
这真的是微软想要的吗?还是我在尝试实现两个互斥的接口?
2个回答

29
两个接口并不是互斥的。它们只是旨在支持不同但有些相关的场景,这些场景同样可以由同一个给定的类来实现。以下是一个简要的解释:
IEditableObject接口
IEditableObject接口旨在支持对象在编辑过程中以某种特定方式管理其内部状态的场景。
因此,该接口包含了明确标记编辑阶段开始、完成或中止的方法,以便在这些阶段采取适当的操作来修改对象的状态。

IRevertibleChangeTracking接口

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

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


2
+1: 你是否了解这些接口的任何已知实现细节或建议使用方法?MSDN在这里极不完整,而谷歌也没有太多返回结果。 - Steven Evers
4
ADO.NET中的一些核心类是有趣的例子。System.Data.DataRow类公开了AcceptChanges / RejectChanges和BeginEdit / CancelEdit / EndEdit方法(尽管没有实现上述任何接口)。BeginEdit方法将行置于挂起事件和验证的状态,直到调用CancelEdit或EndEdit为止。除此之外,CancelEdit还调用RejectChanges,该方法通过将行恢复为其先前的值来撤消所有修改。EndEdit调用AcceptChanges代替,该方法用当前值覆盖先前的值。 - Enrico Campidoglio
谢谢。顺便说一下,你的博客刚有了新读者。它真的很棒。 - Steven Evers
1
2020年的谷歌员工们注意啦:在Code Review上提到了一个相当不错的合作成果,请点击此处查看详情。 - user585968

1

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

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

我经常同时实现这两个接口,以便支持两个级别的撤销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接