项目分层讲解
在 Python(或其他语言)的软件工程实践中,分层架构是组织代码、提升可维护性和可测试性的核心方法。虽然具体项目可能略有差异,但一个典型的 中大型 Python 项目通常包含以下几层(从上到下或从外到内):
🧱 常见的 Python 项目分层结构(由外向内)
| 层级 | 名称 | 职责 | 关键特点 |
|---|---|---|---|
| 1 | 接入层 / 表示层(Presentation Layer) | 接收外部请求并返回响应 | - Web 框架(Flask/FastAPI/Django Views)- API 路由、请求/响应序列化- 不含业务逻辑 |
| 2 | 应用层 / 用例层(Application Layer / Use Case Layer) | 编排业务流程,协调领域对象 | - 定义“用户能做什么”(如 create_order, cancel_booking)- 调用领域层服务- 处理事务、权限、日志等横切关注点 |
| 3 | 领域层 / 业务层(Domain Layer / Business Layer) | 核心业务逻辑与规则 | - 实体(Entity)、值对象(Value Object)- 领域服务(Domain Service)- 你已知的“业务层”就在这里 |
| 4 | 基础设施层(Infrastructure Layer) | 技术实现细节(数据库、第三方 API 等) | - 数据库 ORM(SQLAlchemy)、缓存(Redis)- 邮件发送、文件存储、外部 API 客户端- 为上层提供接口的具体实现 |
💡 这种分层思想源自 Clean Architecture(整洁架构) 或 Hexagonal Architecture(六边形架构),强调 依赖倒置原则(DIP):高层模块不依赖低层模块,两者都依赖抽象。
🔍 各层详解(附 Python 示例)
1️⃣ 接入层(Presentation Layer)
- 作用:处理 HTTP 请求、验证输入格式、返回 JSON/HTML。
- Python 示例(FastAPI):python
# api/routes/order.py from fastapi import APIRouter, Depends from app.application.order_service import create_order # ← 调用应用层 router = APIRouter() @router.post("/orders") def create_order_api( request: CreateOrderRequest, user_id: str = Depends(get_current_user) ): # 仅做参数转换和调用,不写业务逻辑! order = create_order(user_id, request.items) # ← 应用层用例 return OrderResponse.from_entity(order)
2️⃣ 应用层(Application Layer)
- 作用:定义系统用例,协调领域对象完成任务。
- 关键点:
- 无状态(Stateless)
- 不包含业务规则(规则在领域层)
- 处理事务边界(如
@transaction.atomic)
- Python 示例:python
# application/order_service.py from app.domain.order import Order, OrderValidator from app.domain.repository import OrderRepository def create_order(user_id: str, items: list) -> Order: # 1. 调用领域层验证业务规则 if not OrderValidator.can_create(user_id, items): raise ValueError("Invalid order") # 2. 创建领域实体 order = Order.new(user_id, items) # 3. 通过抽象接口保存(依赖注入) repo = get_order_repository() # ← 实际实现来自基础设施层 repo.save(order) return order
3️⃣ 领域层(Domain Layer)— 你的“业务层”
- 作用:封装核心业务概念和规则。
- 组成:
- 实体(Entity):有唯一标识的对象(如
User,Order) - 值对象(Value Object):无标识、不可变的对象(如
Address,Money) - 领域服务(Domain Service):跨多个实体的业务逻辑(如
TransferService) - 领域事件(Domain Event):业务发生时触发(如
OrderCreated)
- 实体(Entity):有唯一标识的对象(如
- Python 示例:python
# domain/order.py class Order: def __init__(self, id: str, user_id: str, items: list): self.id = id self.user_id = user_id self.items = items self.status = "pending" def cancel(self): if self.status != "pending": raise Exception("Cannot cancel non-pending order") # ← 业务规则! self.status = "cancelled" class OrderValidator: @staticmethod def can_create(user_id: str, items: list) -> bool: return len(items) > 0 and user_id is not None # ← 核心规则
4️⃣ 基础设施层(Infrastructure Layer)
- 作用:实现技术细节,为上层提供接口的具体实现。
- 关键原则:
上层定义接口(抽象),本层实现接口(具体)
(例如:领域层定义OrderRepository接口,本层用 SQLAlchemy 实现它) - Python 示例:python
# infrastructure/db/sqlalchemy_repo.py from app.domain.repository import OrderRepository # ← 接口来自领域层! from .models import OrderModel class SQLAlchemyOrderRepository(OrderRepository): def save(self, order: Order): db_order = OrderModel( id=order.id, user_id=order.user_id, status=order.status ) session.add(db_order) session.commit()
🌐 依赖方向(重要!)
mermaid
graph LR
A[接入层] --> B[应用层]
B --> C[领域层]
B --> D[基础设施层]
C -.->|定义接口| D
D -->|实现接口| C- 箭头方向 = 依赖方向
- 领域层绝不依赖基础设施层!(通过接口解耦)
📦 典型项目目录结构
my_project/
├── api/ # 接入层(FastAPI/Flask 路由)
├── application/ # 应用层(用例、服务编排)
├── domain/ # 领域层(实体、业务规则)
├── infrastructure/ # 基础设施层(DB、外部服务)
└── main.py # 入口(依赖注入配置)💡 为什么分层?
| 问题 | 分层如何解决 |
|---|---|
| 业务逻辑散落在 API 中 | → 集中到 领域层 |
| 换数据库要改所有代码 | → 只改 基础设施层 |
| 无法单元测试核心逻辑 | → 领域层 无外部依赖,易测试 |
| 新人看不懂业务重点 | → 领域层 = 业务核心 |
✅ 总结
你已知的“业务层”其实是 领域层(Domain Layer),它只是整个系统的一环。完整的分层包括:
接入层 → 应用层 → 领域层(你的业务层) ← 基础设施层
这种结构让代码:
- 高内聚(业务逻辑集中)
- 低耦合(技术细节可替换)
- 易测试(核心逻辑无需启动数据库)
如果你在写小型脚本,可以不分层;但一旦项目超过 1k 行代码,分层就是生产力的关键!
需要我针对 Flask / FastAPI / Django 给出具体分层模板吗?
