You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI依赖注入改造后,如何配置路由?(C#/React开发者求助)

解决FastAPI依赖注入下无需手动实例化Controller的路由配置问题

你有C#背景,对依赖注入的生命周期和自动解析逻辑应该很熟悉,FastAPI的Depends机制思路和.NET DI一致,只是实现方式略有不同。下面直接上可行方案和代码示例:


1. 保留已实现的Repo/Service依赖函数

假设你已经写好这类依赖定义(如果还没调整,按这个格式对齐即可):

# 示例放在dependencies.py文件中
from functools import lru_cache
from fastapi import Depends
from typing import Annotated

# 用@lru_cache实现单例(等价于.NET的Singleton),不加则默认是请求级别实例(Scoped)
@lru_cache()
def get_some_repo():
    return SomeRepo()

@lru_cache()
def get_some_service(repo: Annotated[SomeRepo, Depends(get_some_repo)]):
    return SomeService(repo)

2. 改造Controller类,通过构造函数注入依赖

把原来需要手动传入Service的Controller,改成构造注入模式,业务逻辑封装为类方法:

# controllers/some_controller.py
from fastapi import APIRouter, Depends, HTTPException
from typing import Annotated
from ..dependencies import get_some_service, SomeService

# 先定义路由实例,和原有逻辑一致
router = APIRouter(prefix="/some", tags=["Some Operations"])

class SomeController:
    # 构造函数接收Service依赖,和C#构造注入逻辑完全一致
    def __init__(self, service: SomeService):
        self.service = service

    # 业务方法,保留原有Controller的逻辑即可
    def get_item(self, item_id: int):
        item = self.service.get_item(item_id)
        if not item:
            raise HTTPException(status_code=404, detail="Item not found")
        return item

    def create_item(self, item_data: dict):
        return self.service.create_item(item_data)

# 定义Controller实例的依赖函数,自动注入Service
def get_some_controller(service: Annotated[SomeService, Depends(get_some_service)]):
    return SomeController(service)

3. 绑定路由到Controller方法,无需手动实例化

在同一个Controller文件中,将路由操作与Controller的业务方法关联,通过Depends自动获取Controller实例:

# 接上面的some_controller.py代码
@router.get("/items/{item_id}")
def get_item(
    item_id: int,
    # 每次请求时,FastAPI自动调用get_some_controller创建实例,并完成整条依赖链的注入
    controller: Annotated[SomeController, Depends(get_some_controller)]
):
    return controller.get_item(item_id)

@router.post("/items")
def create_item(
    item_data: dict,
    controller: Annotated[SomeController, Depends(get_some_controller)]
):
    return controller.create_item(item_data)

4. 在main.py中正常挂载路由

这一步和你原来的操作完全一致,不需要实例化Controller,直接挂载路由实例即可:

# main.py
from fastapi import FastAPI
from controllers.some_controller import router as some_router

app = FastAPI(title="Your Tool API")

# 直接挂载路由,FastAPI会自动处理所有依赖注入逻辑
app.include_router(some_router)

关键逻辑说明

  • FastAPI的Depends会自动解析整个依赖链:每次请求进来时,先调用get_some_repo获取Repo实例,再传入get_some_service得到Service,最后传入get_some_controller创建Controller实例,全程无需手动实例化任何对象。
  • 生命周期控制:加@lru_cache()就是单例模式;不加则默认是请求级别实例,这也是Web应用的常用模式。
  • 这种方式和你熟悉的C# DI思路完全对齐:依赖通过构造注入,框架负责实例化和生命周期管理,你只需要专注业务逻辑。

内容的提问来源于stack exchange,提问作者Ryan McAlpine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:44:52