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

FastAPI路径操作函数依赖优化咨询:简化依赖传递方式

FastAPI 路径操作函数依赖优化方案

问题1:简化路径操作函数的依赖注入

可以通过合并依赖组的方式大幅减少endpoint中的参数数量:

  • 单独创建一个依赖函数,把所有需要的依赖项打包返回
  • 在路径操作函数中只声明一个参数,获取打包后的所有依赖

示例代码:

# 定义依赖组函数,打包所有需要的依赖
def get_order_dependencies(
    session: Session = Depends(get_db),
    wm_db: Session = Depends(get_wm_db),
    sm_session: Session = Depends(get_sm_db),
    actor_service: ActorService = Depends(get_actor_service),
    event_service: EventService = Depends(get_event_service),
    item_service: ItemService = Depends(get_item_service),
    sm_service: StandardMaterialService = Depends(get_standard_material_service),
    comment_service: CommentService = Depends(get_comment_service),
    wm_service: WorkManagerService = Depends(get_wm_service),
    warehouse_service: WarehouseInventoryService = Depends(get_warehouse_inventory_service),
):
    return {
        "session": session,
        "wm_db": wm_db,
        "sm_session": sm_session,
        "actor_service": actor_service,
        "event_service": event_service,
        "item_service": item_service,
        "sm_service": sm_service,
        "comment_service": comment_service,
        "wm_service": wm_service,
        "warehouse_service": warehouse_service,
    }

# 简化后的路径操作函数
@router.get("/{order_id}", tags=["orders"], response_model=OrderOutput)
async def get_order_by_id(
    order_id: int,
    deps: dict = Depends(get_order_dependencies),
    order_service: OrderService = Depends(get_order_service),
) -> OrderOutput:
    return order_service.get_order_by_id(order_id, **deps)

问题2:直接向OrderService注入依赖

完全可以实现,不需要通过路径操作函数中转依赖。核心是调整OrderService的构造逻辑和对应的依赖提供者:

  1. 在OrderService的__init__方法中声明它需要的所有依赖项
  2. 修改get_order_service函数,让它通过FastAPI的依赖注入自动获取这些依赖,再实例化OrderService

示例代码:

# 重构后的OrderService类,直接在构造函数中声明依赖
class OrderService:
    def __init__(
        self,
        session: Session,
        wm_db: Session,
        sm_session: Session,
        actor_service: ActorService,
        event_service: EventService,
        item_service: ItemService,
        sm_service: StandardMaterialService,
        comment_service: CommentService,
        wm_service: WorkManagerService,
        warehouse_service: WarehouseInventoryService,
    ):
        # 将依赖绑定到实例属性,业务方法直接使用
        self.session = session
        self.wm_db = wm_db
        self.sm_session = sm_session
        self.actor_service = actor_service
        self.event_service = event_service
        self.item_service = item_service
        self.sm_service = sm_service
        self.comment_service = comment_service
        self.wm_service = wm_service
        self.warehouse_service = warehouse_service

    def get_order_by_id(self, order_id: int) -> OrderOutput:
        # 直接使用self上的依赖处理业务逻辑,无需再传参数
        ...

# 调整后的依赖提供者,自动注入所有需要的依赖并返回OrderService实例
def get_order_service(
    session: Session = Depends(get_db),
    wm_db: Session = Depends(get_wm_db),
    sm_session: Session = Depends(get_sm_db),
    actor_service: ActorService = Depends(get_actor_service),
    event_service: EventService = Depends(get_event_service),
    item_service: ItemService = Depends(get_item_service),
    sm_service: StandardMaterialService = Depends(get_standard_material_service),
    comment_service: CommentService = Depends(get_comment_service),
    wm_service: WorkManagerService = Depends(get_wm_service),
    warehouse_service: WarehouseInventoryService = Depends(get_warehouse_inventory_service),
) -> OrderService:
    return OrderService(
        session=session,
        wm_db=wm_db,
        sm_session=sm_session,
        actor_service=actor_service,
        event_service=event_service,
        item_service=item_service,
        sm_service=sm_service,
        comment_service=comment_service,
        wm_service=wm_service,
        warehouse_service=warehouse_service,
    )

# 最终极简版路径操作函数
@router.get("/{order_id}", tags=["orders"], response_model=OrderOutput)
async def get_order_by_id(
    order_id: int,
    order_service: OrderService = Depends(get_order_service),
) -> OrderOutput:
    return order_service.get_order_by_id(order_id)

这种方式下,路径操作函数只需关注业务参数和核心服务,所有依赖注入逻辑都交给FastAPI处理,代码职责更清晰,维护性更强。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:17:20