# 经典分层架构与职责划分

URL: https://caijiao.org/ddd/chapter4/layered-architecture
Source: docs/ddd/chapter4/layered-architecture.md
Description: 介绍经典分层架构及其在领域驱动设计中的应用，帮助开发者更好地划分系统的职责与层次。

在领域驱动设计（DDD）中，经典的**分层架构**是将系统划分为多个层次，每个层次负责不同的职责，从而实现解耦和可维护性。这种架构模式常常用于复杂的业务系统中，可以帮助开发者清晰地分离不同的业务逻辑和技术细节。

## 经典分层架构概述

经典的分层架构通常包括以下几层：

1. **表示层（Presentation Layer）**：负责与用户进行交互，处理用户请求并展示数据。通常包含 UI、API 或前端应用。
2. **应用层（Application Layer）**：负责协调各个领域对象和服务的调用，控制业务流程。它并不包含业务逻辑，而是依赖于领域层提供的功能。
3. **领域层（Domain Layer）**：包含核心的业务逻辑，是应用的“心脏”。它包含领域模型、领域服务、聚合等。
4. **基础设施层（Infrastructure Layer）**：负责提供技术支持，如数据库访问、文件系统、消息队列等。它通常为其他层提供技术实现，保证系统的稳定运行。

## 各层职责

### 1. 表示层（Presentation Layer）

表示层主要负责与用户进行交互，其职责包括：

- 处理用户输入并返回合适的输出。
- 调用应用层的服务来处理请求。
- 组织数据并渲染视图，向用户展示数据。

在 Web 应用中，表示层可能会涉及到 REST API、GraphQL 或前端框架（如 Vue.js、React 等）。它的职责仅限于显示数据并接受用户的输入，并不包含业务逻辑。

### 2. 应用层（Application Layer）

应用层的职责是协调多个领域对象和服务的调用，控制业务的流程。它作为领域层与表示层之间的中介，负责：

- 调用领域层中的业务逻辑。
- 处理应用级别的事务，管理事务的开始与结束。
- 可能包含应用程序的工作流和协调逻辑，但不应包含业务逻辑。

应用层通常定义了用例（Use Case），例如在电商系统中，一个用例可能是“创建订单”。应用层将协调各个领域服务与实体对象来实现该用例的业务需求。

### 3. 领域层（Domain Layer）

领域层是整个应用程序的核心，包含业务模型、领域逻辑和规则。其职责是：

- 定义业务对象（如实体、值对象、聚合等）。
- 实现业务规则和领域逻辑。
- 提供领域服务，处理复杂的业务场景。

领域层中的核心部分包括**领域模型**，即实体（Entity）和值对象（Value Object），以及与业务逻辑密切相关的**领域服务（Domain Service）**和**领域事件（Domain Event）**。该层应保持纯粹，专注于业务逻辑，避免与技术实现或外部系统的依赖。

### 4. 基础设施层（Infrastructure Layer）

基础设施层提供系统运行所需的技术支持，包括数据持久化、网络通信、文件存储、外部 API 调用等。其职责包括：

- 数据库访问：通过仓储模式（Repository）与数据库进行交互。
- 外部服务集成：调用第三方服务或处理消息队列等外部系统集成。
- 提供通用的服务支持，如日志、缓存、事务管理等。

基础设施层的设计应确保与其他层的解耦，避免基础设施的变化影响到领域层和应用层的设计。它通常通过接口实现，将具体的技术实现与领域逻辑分离。

## 层次之间的交互

各层之间的交互通常是单向的，确保了系统的松耦合。下面是各层交互的典型模式：

- **表示层**调用应用层：表示层不会直接操作领域层，而是通过应用层来请求业务操作。
- **应用层**调用领域层：应用层依赖于领域层来完成实际的业务逻辑。
- **领域层**与基础设施层的交互：领域层可以通过接口与基础设施层交互，但不应依赖于具体实现。基础设施层的实现可以通过依赖注入的方式传递给领域层。

这种分层设计的好处是清晰地将技术实现与业务逻辑分开，从而提高代码的可维护性和可测试性。

## 分层架构与 DDD 的结合

在领域驱动设计中，分层架构为 DDD 的实现提供了一个良好的基础。通过将复杂的业务逻辑分隔到领域层中，分层架构帮助开发者保持代码的清晰和高内聚。DDD 的许多概念（如聚合、实体、值对象等）都能很好地与分层架构结合。

例如，在电商系统中，**订单**是一个领域对象，它位于领域层，而订单的创建操作通常由应用层负责。基础设施层则负责持久化订单数据，而表示层负责与用户进行交互。

### 举例：电商系统中的分层架构

假设我们有一个电商系统，系统涉及订单创建、支付、物流等功能。我们可以按照分层架构来组织系统：

- **表示层**：包含 REST API，提供“创建订单”的接口，接收用户请求。
- **应用层**：负责协调业务逻辑，调用领域层的服务来创建订单并处理支付。
- **领域层**：包含**订单**实体、**订单服务**、**支付服务**等，负责订单的具体业务逻辑。
- **基础设施层**：实现订单持久化、支付网关调用、物流管理等技术功能。

通过这种方式，系统的各个部分职责清晰，层与层之间通过接口进行解耦，增强了系统的可维护性和扩展性。

## 总结

经典的分层架构通过将系统划分为多个层次，每一层负责不同的职责，帮助开发者更好地管理复杂的业务逻辑和技术细节。通过与领域驱动设计的结合，分层架构使得业务逻辑更加清晰，层次间的耦合度降低，提高了系统的可维护性和可扩展性。
