Skip to content

项目分层讲解

在 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
  • 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 给出具体分层模板吗?

Released under the MIT License.