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的构造逻辑和对应的依赖提供者:
- 在
OrderService的__init__方法中声明它需要的所有依赖项 - 修改
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
相关产品推荐
相关产品推荐

