跳转至

Symphra Container

企业级 Python 依赖注入容器库,支持同步和异步服务。

特性

  • 🎯 4 种生命周期支持 (Singleton, Transient, Scoped, Factory)
  • 💪 完整的类型提示支持
  • ⚡ 高性能实现
  • 🔄 循环依赖检测与解决
  • 🎪 拦截器系统
  • 🌍 统一异步/同步支持
  • 🔌 可选的框架集成 (FastAPI, Flask, Django)

安装

# 基础安装
pip install symphra-container

# 安装 FastAPI 集成
pip install symphra-container[fastapi]

# 安装 Flask 集成
pip install symphra-container[flask]

# 安装 Django 集成
pip install symphra-container[django]

# 安装所有集成
pip install symphra-container[all]

快速开始

基本用法

from symphra_container import Container, Lifetime

# 创建容器
container = Container()

# 注册服务
class UserService:
    def get_user(self, user_id: int):
        return {"id": user_id, "name": "User"}

container.register(UserService, lifetime=Lifetime.SINGLETON)

# 解析服务
service = container.resolve(UserService)
user = service.get_user(123)

异步服务

import asyncio

class AsyncUserService:
    async def get_user(self, user_id: int):
        await asyncio.sleep(0.1)
        return {"id": user_id, "name": "Async User"}

# 注册异步服务(自动检测)
container.register(AsyncUserService, lifetime=Lifetime.SINGLETON)

# 使用 resolve_async 解析
async def main():
    service = await container.resolve_async(AsyncUserService)
    user = await service.get_user(456)
    print(user)

asyncio.run(main())

框架集成 (可选)

FastAPI

from fastapi import FastAPI, Depends
from symphra_container.integrations import fastapi_inject, setup_fastapi

app = FastAPI()
setup_fastapi(app, container)

@app.get("/users/{user_id}")
async def get_user(
    user_id: int,
    user_service: UserService = Depends(fastapi_inject(UserService))
):
    return await user_service.get_user(user_id)

Flask

from flask import Flask
from symphra_container.integrations import FlaskContainer

app = Flask(__name__)
flask_container = FlaskContainer(app, container)

@app.route("/users/<int:user_id>")
@flask_container.inject
def get_user(user_id: int, user_service: UserService):
    return user_service.get_user(user_id)

Django

# settings.py
from symphra_container.integrations import DjangoContainer

CONTAINER = Container()
DjangoContainer.setup(CONTAINER)

MIDDLEWARE = [
    'symphra_container.integrations.django.ContainerMiddleware',
    # ...
]

# views.py
@DjangoContainer.inject
def user_view(request, user_id: int, user_service: UserService):
    return JsonResponse(user_service.get_user(user_id))

文档

性能

  • 服务解析: ~0.05ms
  • 单例缓存: ~0.01ms
  • 内存占用: < 1MB (1000 服务)

许可

MIT