《实现领域驱动设计》读书笔记摘抄(11)—— 工厂

Administrator 499 2022-05-06

第11章 工厂

本章学习路线图

  • 学习为什么工厂可以创建具有表达性的、符合通用语言的模型
  • 学习SaaSOvation团队是如何将工厂方法作为**聚合(10)**的行为方法的
  • 学习如何使用工厂方法来创建其他类型的聚合
  • 学习在与其他限界上下文(2)集成并将外部对象翻译成本地对象时,如何将领域服务当做工厂来使用

领域模型中的工厂

工厂应该提供一个创建对象的接口,该接口封装了所有创建对象的复杂操作过程。除了创建对象之外,工厂并不需要承担领域模型中的其他职责。一个含有工厂方法的聚合根的主要职责是完成它的聚合行为,而工厂方法只是其中之一。

另外,在聚合上使用工厂方法也有助于更好地表达通用语言,而这是使用构造函数所不能达到的。

聚合根中的工厂方法

在**聚合(10)**中,我们讨论到了Product上的工厂方法。比如,planBacklogItem()方法用于创建新的BacklogItem。书中本章 以多个示例来展现对工厂方法的使用。

这里的工厂方法模式可以不断地重复使用。总的来说,它拥有以下好处:有效地表达限界上下文中的通用语言;减轻客户端在创建新聚合时的负担;确保所创建的实例处于正确的状态。

领域服务中的工厂

SaaSOvation团队提供了协作上下文的另一个例子,用于创建Collaborator实例:

public interface CollaboratorService {
    public Author authorFrom(Tenant tenant, String identity);
}

由于继承自抽象类Collaborator的新对象都通过领域服务进行创建,此时的领域服务就扮演了工厂的角色,如下是其中一个的实现:

public Author authorFrom(Tenant tenant, String identity) {
    return (Author) UserInRoleAdapter
        .newInstance()
        .toCollaborator(tenant, identity, "Author", Author.class);
}

通过使用基于领域服务的工厂,我们得以将两个限界上下文的生命周期和概念术语进行分离。更多细节参考集成限界上下文(13)