前一篇文章:"学习领域驱动设计(二)之上下文映射图及架构"给大家主要介绍了上下文映射图的概念,以及粗略的简介了在领域驱动设计中主要使用到架构知识,而这篇文章主要来学习在领域驱动中实体的作用。
当我们在考虑一个对象的个性特征,或者需要区分不同的对象时,我们需要引入实体的概念。
一个实体是一个唯一的东西,并且可以在相当长的时间内持续发生变化。我们可以对实体进行多次修改,故实体对象可能和它先前的状态不大相同。但是,由于它们拥有相同的身份标识(Identity),它们依然是同一个实体。
唯一的身份标识和可变性是实体对象与值对象的根本区别
本章的最终目的:如何正确地使用和设计实体
1.唯一标识
在设计实体时,我们首先需要考虑实体的本质特征,而不是一开始便关注实体的属性和行为。找到能够实现唯一标识性的方式,同时还要考虑如何在实体的生命周期内维持它的唯一性。
唯一标识用于实体实体匹配通常取决于标识的可读性。
1.1生成唯一标识的方式
1.用户提供唯一的标识
让用户手动输入对象标识看起来是一种很直接的做法,但是这种方式也可能变得很复杂。复杂性在于:1.需要用户自己生成高质量的标识,有可能输入的标识是唯一性,但也有可能是不正确的。
2.应用程序生成唯一标识
有很多可靠的方法都可以自动生成唯一标识,但是如果应用程序处于集群环境或者分布在不同的计算节点,我们就需要小心。以下方式可以生成1.计算机节点的当前时间,以毫秒记 2.计算机节点的IP地址 3.GUID
3.持久化机制生成唯一标识
4.另一个限界上下文提供唯一标识
5.委派标识
委派标识说白点就是数据库的自增主键,利用自增主键的特性生成唯一标识。在开发过程中我们大多应用场景都是采用这个方式来生成唯一标识来关联实体。
1.2发现实体及本质特征
1.2.1角色和职责
建模的一个方面是发现对象的角色和职责,通常来说,对角色和职责分析师可以应用在领域对象上。
领域对象扮演多种角色
在面向对象编程中,通常由接口来定义实现类的角色。在正确的设计的情况下,一个类对于每一个它所实现的接口来说,都存在一种角色。如果一个类没有显式的角色即该类没有实现任何显式接口,则默认情况下,它扮演的是本来的角色。
Public interface User{}//User对象
User类没有实现任何接口,但是它仍然扮演的是User角色。
1.2.2 验证
验证的主要目的在于检查模型的正确性,检查的对象可以是某个属性,也可以是整个对象,甚至是多个对象的组合。
1.验证属性,在C#中又称契约验证
2.验证整体对象
有时候实体中的所有单个的属性都是合法的,但是并不意味着整个实体就是合法的。要验证整个实体,我们需要访问整个对象的状态即所有对象的属性
3.验证对象组合
在需要对复杂对象进行验证时,我们可以使用延迟验证。因为有时候我们关注的并不是单独的实体的是否合法,还需要关注多个实体的组合是否合法。