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

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

关键要点

可变模型应该具备自我验证的能力,并实现验证接口。
在共享对象时(特别是在跨线程共享时),考虑使用不可变模型。
考虑支持MVVM风格UI的单层和多层撤消。
在实现属性变更通知时避免不必要的内存分配。
不要覆盖模型的Equals和GetHashCode方法。

在传统的MVC、MVP、MVVM、Web MVC这些UI模式中,模型是一个公共元素。虽然有很多文章讨论这些架构中的视图和控制器,但几乎无一涉及模型。在本文中,我们将讨论模型本身以及相应的.NET接口。

我想先定义一些术语,这些术语在其他文章中可能有更精确的定义,但对于我们来说这些已经足够了。

数据模型(Data Model)

数据模型时包含数据(即属性和集合)和行为的对象或对象图。数据模型是本文的重点。

数据传输对象(Data Transfer Object,DTO)

DTO是只包含属性和集合的对象或对象图。一个真正的DTO没有任何行为,而且几乎是不可变的。

不过,在使用代码生成工具生成DTO时,通常会使用一些简单的接口(如INotifyPropertyChanged)。

对象图(Object Graph)

一个对象图由一个对象和所有可触及的子对象组成。在讨论数据模型和DTO时,我们所说的对象图都是单向树状结构(循环图是存在的,但它们会对序列化框架造成影响)。