4. 聚合和聚合根
大型系统或复杂领域可能有成百上千的实体和值对象,它们有着错综复杂的关系。领域模型需要一种方法来管理这些关联,更重要的是,在逻辑上属于同一分组的实体和值对象需要定义一个接口,让其他实体能够通过该接口与它们交互。如果没有这类构造,那么以后不同分组对象之间的交互将会相互干扰并产生问题。
聚合概念将逻辑实体和值对象分组。根据DDD的定义,聚合只是“一族出于数据变化目的而被视作一个单元的相关联对象”。聚合根是一个实体,它是这个聚合中唯一能够允许聚合外的对象持有引用的成员。DDD中的聚合概念是为了确保领域模型中的数据完整性。聚合根是一个充当进入聚合的逻辑途径的特殊实体。例如,如果在电子商务商店上下文中获取一张订单,那么可以将其视为聚合根,因为我们只希望通过访问聚合的根来编辑订单项或应用一张凭证。这使得复杂对象图能够保持一致,而且能够遵守业务规则。因此,与其让一个订单对象通过简单的List属性来暴露它发出的凭证集合,不如让它拥有一些带有复杂规则的方法,能够允许将凭证应用到它并且把凭证列表表现为一个用于显示的只读集合。
5. 领域服务
在Domain Model模式银行账号练习中曾经见到,BankAccountService类包含在两个银行账号之间转账的逻辑。那些没有真正位于单个实体中或者需要访问资源库的方法都被放到领域服务中。领域服务层还可以包含自己的领域逻辑,而且可以作为领域模型的重要组成部分,像实体和值对象一样。
6. 应用程序服务
应用程序服务是位于领域模型之上的一个瘦层,负责协调应用程序活动。它并不包含业务逻辑,也没有保存任何实体的状态。但它可以存放业务工作流事务的状态。在领域模型银行账号练习中,可以采用Request-Reply消息传送模式,使用应用程序服务来提供访问领域模型的API。
7. 资源库
Repository模式(将在第7章中更详细地研究)充当业务实体的内存集合或仓库,它完全将底层的数据基础设施抽象出来。该模式可用来将领域模型与任何基础设施关注点分离,使其成为POCO和PI。
8. 分层
在DDD中,分层是一种重要的概念,因为它有助于加强关注点的分离。图4-7所示为构成DDD的各个层次和概念的图形化表示。但应该强调的是,在开发复杂业务应用程序时,DDD更多地关乎心态,而不是如何建立解决方案。