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

从ASP.NET Core转FastAPI:能否通过抽象类实现依赖注入?

在FastAPI中实现抽象类与实现类的依赖注入映射

完全可以在FastAPI中实现类似ASP.NET Core的抽象类-实现类依赖映射与构造函数注入,既可以用FastAPI原生的依赖系统,也可以借助第三方DI库获得更贴近ASP.NET Core的体验。

一、FastAPI原生实现方案

FastAPI的原生依赖系统基于Depends,可以通过定义依赖函数来实现抽象与实现的绑定,具体步骤如下:

1. 修正并完善基础代码

先修正示例中的语法错误与命名规范(遵循PEP8):

from fastapi import FastAPI, Depends
from abc import ABC, abstractmethod

# 抽象产品仓库类
class ABCProductRepository(ABC):
    @abstractmethod
    def create_product(self, product_data: str) -> None:
        pass

# 具体实现类
class ProductRepository(ABCProductRepository):
    def create_product(self, product_data: str) -> None:
        print(f"创建新产品: {product_data}")

# 业务服务类,通过构造函数注入抽象依赖
class ProductService:
    def __init__(self, product_repo: ABCProductRepository):
        self.product_repo = product_repo

    def save_product(self, product_data: str):
        self.product_repo.create_product(product_data)

2. 定义依赖绑定并注入

通过依赖函数将抽象类与实现类关联,再在服务或路由中注入:

app = FastAPI()

# 定义依赖函数:返回抽象类的具体实现实例
def get_product_repo() -> ABCProductRepository:
    return ProductRepository()

# 可选:定义服务的依赖函数,自动注入仓库依赖
def get_product_service(
    product_repo: ABCProductRepository = Depends(get_product_repo)
) -> ProductService:
    return ProductService(product_repo)

# 路由中使用依赖注入
@app.post("/products")
def save_product(
    product_data: str,
    product_service: ProductService = Depends(get_product_service)
):
    product_service.save_product(product_data)
    return {"message": "产品创建成功"}

3. 动态替换实现(类似ASP.NET Core的依赖替换)

如果需要在测试或不同环境替换实现,可使用FastAPI的dependency_overrides:

# 假设定义了一个Mock实现
class MockProductRepository(ABCProductRepository):
    def create_product(self, product_data: str) -> None:
        print(f"Mock创建新产品: {product_data}")

# 替换依赖映射
app.dependency_overrides[get_product_repo] = lambda: MockProductRepository()

二、使用第三方DI库(更贴近ASP.NET Core体验)

如果需要更强大的DI功能(比如生命周期管理、全局配置映射),可以使用dependency-injector库,它支持类似ASP.NET Core的容器配置方式:

1. 安装依赖

pip install dependency-injector

2. 配置DI容器并注入

from fastapi import FastAPI
from abc import ABC, abstractmethod
from dependency_injector import containers, providers

# 抽象类与实现类(同之前的定义)
class ABCProductRepository(ABC):
    @abstractmethod
    def create_product(self, product_data: str) -> None:
        pass

class ProductRepository(ABCProductRepository):
    def create_product(self, product_data: str) -> None:
        print(f"创建新产品: {product_data}")

class ProductService:
    def __init__(self, product_repo: ABCProductRepository):
        self.product_repo = product_repo

    def save_product(self, product_data: str):
        self.product_repo.create_product(product_data)

# 定义DI容器,注册抽象与实现的映射
class Container(containers.DeclarativeContainer):
    # 将抽象类绑定到具体实现类
    product_repo = providers.Factory(ABCProductRepository, ProductRepository)
    # 注册服务,自动注入依赖
    product_service = providers.Factory(ProductService, product_repo=product_repo)

app = FastAPI()
# 初始化容器
container = Container()

# 路由中直接从容器获取服务实例
@app.post("/products")
def save_product(
    product_data: str,
    product_service: ProductService = Depends(container.product_service)
):
    product_service.save_product(product_data)
    return {"message": "产品创建成功"}

这种方式支持单例、请求作用域等生命周期管理,完全符合ASP.NET Core开发者的使用习惯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:10:39