Dishka 开源项目教程
1. 项目介绍
Dishka 是一个可爱的依赖注入(DI)框架,具有作用域和友好的 API。该项目旨在提供一个仅限于 IoC 容器的库,但使其真正有用。Dishka 专注于依赖注入的核心任务,不试图解决与依赖注入无关的问题。它通过作用域管理对象的生命周期,支持模块化提供者,并且具有简洁的 API。
2. 项目快速启动
安装 Dishka
首先,使用 pip 安装 Dishka:
pip install dishka
创建 Provider 实例
Provider 用于设置所有工厂以提供对象。以下是一个简单的示例:
from dishka import Provider, Scope
provider = Provider()
def get_a() -> A:
return A()
def get_b(a: A) -> B:
return B(a)
provider.provide(get_a, scope=Scope.APP)
provider.provide(get_b, scope=Scope.REQUEST)
创建 Container 实例
Container 用于管理依赖项的缓存并检索它们。以下是如何创建 Container 实例并进入 APP 作用域的示例:
from dishka import make_container
container = make_container(provider)
# 获取 APP 作用域的依赖项
a = container.get(A)
# 进入 REQUEST 作用域
with container() as request_container:
b = request_container.get(B)
a = request_container.get(A)
关闭 Container
在结束时关闭 Container:
container.close()
3. 应用案例和最佳实践
使用 Dishka 与 FastAPI 集成
Dishka 可以与 FastAPI 集成,以下是一个简单的示例:
from dishka.integrations.fastapi import FromDishka, inject, setup_dishka
from fastapi import FastAPI, APIRouter
app = FastAPI()
router = APIRouter()
@router.get("/")
@inject
async def index(a: FromDishka[A]) -> str:
return str(a)
setup_dishka(container, app)
模块化提供者
将工厂拆分为多个类,使它们更简单且可重用:
class MyProvider(Provider):
@provide(scope=Scope.APP)
def get_a(self) -> A:
return A()
@provide(scope=Scope.REQUEST)
def get_b(self, a: A) -> B:
return B(a)
4. 典型生态项目
FastAPI
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API。Dishka 可以与 FastAPI 集成,提供依赖注入功能。
SQLAlchemy
SQLAlchemy 是一个 Python SQL 工具包和对象关系映射器(ORM)。Dishka 可以用于管理 SQLAlchemy 会话的生命周期。
AIOHTTP
AIOHTTP 是一个异步 HTTP 客户端/服务器框架。Dishka 可以与 AIOHTTP 集成,提供依赖注入功能。
通过以上内容,您可以快速上手 Dishka 项目,并了解其在实际应用中的使用方法和最佳实践。