Python 后端基础(十五):分层架构怎么做,Controller、Service、Repository 到底怎么拆
2026/7/5 1:20:21 网站建设 项目流程

很多后端初学者写项目时,最容易出现一个问题:所有代码都堆在接口函数里。

接口里既接收参数,又查数据库,又写业务逻辑,又调第三方 API,又拼返回结果。刚开始能跑,后面一改就崩。

分层架构就是为了解决这个问题。

【一、为什么要分层】

不分层的代码通常是这样:

路由函数

-> 校验参数

-> 查询数据库

-> 判断权限

-> 调用模型 API

-> 写日志

-> 返回结果

所有逻辑混在一起,问题是:

- 难测试。

- 难复用。

- 难定位问题。

- 换数据库或换模型 API 很麻烦。

- 新人看代码很痛苦。

分层后,每一层只做自己的事。

【二、常见三层结构】

后端项目里常见:

Controller / API 层:处理请求和响应

Service 层:处理业务逻辑

Repository / DAO 层:处理数据库访问

在 FastAPI 里,Controller 通常就是 router。

【三、API 层做什么】

API 层负责:

- 接收 HTTP 请求。

- 解析路径参数、查询参数、请求体。

- 调用 Service。

- 返回响应。

- 处理状态码。

API 层不应该写大量业务规则。

示例:

@router.post("/knowledge-bases")

def create_kb(req: KnowledgeBaseCreate, user=Depends(get_current_user)):

kb = kb_service.create_kb(user_id=user.id, name=req.name)

return kb

它只负责把请求转给 Service。

【四、Service 层做什么】

Service 层负责业务逻辑。

例如创建知识库:

class KnowledgeBaseService:

def create_kb(self, user_id: int, name: str):

if self.repo.exists_by_name(user_id, name):

raise BizError("知识库名称已存在")

return self.repo.create(user_id=user_id, name=name)

这里的规则是:同一个用户不能创建重名知识库。

这种规则不应该散落在多个接口里。

【五、Repository 层做什么】

Repository 层只关心数据访问。

class KnowledgeBaseRepository:

def exists_by_name(self, user_id: int, name: str) -> bool:

return self.db.query(KnowledgeBase).filter_by(

user_id=user_id,

name=name

).first() is not None

它不应该关心 HTTP,也不应该关心前端传了什么。

【六、为什么这样更适合测试】

如果业务逻辑在 Service 层,你可以单独测试:

def test_create_kb_duplicate_name():

service = KnowledgeBaseService(fake_repo)

with pytest.raises(BizError):

service.create_kb(user_id=1, name="默认知识库")

不用启动整个 Web 服务,也不用真的连数据库。

【七、AI 项目更需要分层】

AI 应用后端里,经常还有这些组件:

- LLM Client:调用大模型。

- Retriever:检索知识库。

- Tool Executor:执行工具。

- Workflow:编排多步骤流程。

- Prompt Builder:拼接提示词。

- Evaluator:评估输出。

如果不分层,Agent 项目很容易变成一坨流程代码。

推荐:

API 层:提供接口

Service 层:业务流程

Workflow 层:Agent/RAG 编排

Client 层:调用 LLM、向量库、外部 API

Repository 层:保存用户、任务、日志、文档

【八、常见坑】

- 为了分层而分层,小项目拆得过碎。

- Service 只是简单转发,没有业务价值。

- Repository 里写大量业务判断。

- API 层直接写 SQL。

- 所有工具类都叫 utils,最后 utils 巨大无比。

- 类名很高级,但实际代码没有清晰职责。

【九、面试常问】

1. 为什么后端项目要分层?

分层可以让请求处理、业务逻辑和数据访问职责清晰,降低耦合,便于测试、复用和维护。

2. Service 层和 Repository 层区别是什么?

Service 层负责业务规则和流程编排;Repository 层负责数据库读写,不应该关心 HTTP 请求和业务流程。

3. 分层是不是越多越好?

不是。分层要服务于复杂度。小项目可以简单拆,复杂项目再增加领域服务、客户端、工作流等层次。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询