IEditableObject和IRevertibleChangeTracking有什么区别?

IEditableObject和IRevertibleChangeTracking (两者都来自System.ComponentModel命名空间)有什么区别? 看起来第一个支持显式事务,而第二个支持更隐式 – 但最终结果是相同的。 我应该如何在代码中实现它? 目前我在BeginEdit中什么都不做,并分别在EndEdit和CancelEdit中调用RejectChanges和AcceptChanges 。 我的问题是,这也将接受在B​​eginEdit之前所做的更改。

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

这两个接口不是互斥的。 它们只是用于支持不同但有些相关的场景 ,这些场景也可能由同一个给定的类实现。 这是一个快速解释:

IEditableObject接口

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

因此,界面包括明确标记编辑阶段何时开始,完成或中止的方法,以便可以采取适当的操作来修改对象在这些阶段的状态。


IRevertibleChangeTracking界面

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

该接口具有一些方法,用于标记何时应将对象的当前状态设置为永久状态,或者应将其恢复为上一个已知的永久状态。

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

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

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