C# API中模型与它们的接口设计详解

2020-01-05 09:30:12王冬梅

对于我自己的集合,我经常会公开一个INotifyItemPropertyChanged接口,用于将集合中对象的任意PropertyChanged事件转成单个ItemPropertyChanged事件。

为此,集合需要在将对象添加到集合或从集合中移除时附加和移除事件处理程序。

变更跟踪和撤消

虽然使用不是很频繁,.NET还是提供了专门用于跟踪对象变更的接口,这些接口甚至还提供了撤消功能。

变更跟踪

从表面上看,IChangeTracking接口看起来好像很容易理解:对象发生变化或者没有发生变化。但实际上它有点微妙。

从用户界面角度来看,用户通常想知道的是“这个对象或它的任何子对象是否发生变化了?”

从数据存储角度来看,你希望知道对象本身是否发生了变化。

文档里没有提到这些,因为它没有定义一个子对象是否被认为是“对象内容”的一部分。我个人偏好让IsChanged包含子对象的变化,并为数据存储添加单独的IsChangedLocal属性。

可恢复变更跟踪

IRevertableChangeTracking添加了一个RejectChanges方法来撤消任何挂起的更改。这里存在同样的问题,即这个方法适用于本地对象还是子对象。

我通常假设RejectChanges会遍历对象图,并拒绝所有挂起的变更。但在涉及集合属性时,这可能有点蹊跷,最好是将其封装在类中,而不是尝试构建临时解决方案。