python的依赖注入。
kink的Python项目详细描述
扭结
python依赖注入
特点
- 易于使用的界面
- 可通过自定义依赖关系解析程序进行扩展
- 自动依赖注入
- 轻量级
- 支持async with asyncio
安装
pip install kink
使用
将服务添加到依赖注入容器
依赖容器是dict-like对象,向依赖容器添加新服务 简单如下:
^{pr2}$将服务工厂添加到依赖注入容器
Kink还支持按需创建服务。为了定义这样的服务,lambda函数 应使用:
fromkinkimportdifromsqlite3importconnectdi["db_connection"]=lambdadi:connect(di["db_name"])
在这种情况下,除非请求服务,否则不会建立到数据库的连接。在
从m依赖注入容器请求服务
fromkinkimportdifromsqlite3importconnect# Setting servicesdi["db_name"]="test_db.db"di["db_connection"]=lambdadi:connect(di["db_name"])# Getting serviceconnection=di["db_connection"]# will return instance of sqlite3.Connectionassertconnection==di["db_connection"]# True
自动关联依赖项
fromkinkimportdi,injectfromsqlite3importconnect,Connectiondi["db_name"]="test_db.db"di["db_connection"]=lambdadi:connect(di["db_name"])# Inject connection from di, connection is established once function is called.@injectdefget_database(db_connection:Connection):...connection=get_database()connection_with_passed_connection=get_database(connect("temp.db"))# will use passed connection
构造函数注入
fromkinkimportinject,diimportMySQLdb# Set dependenciesdi["db_host"]="localhost"di["db_name"]="test"di["db_user"]="user"di["db_password"]="password"di["db_connection"]=lambdadi:MySQLdb.connect(host=di["db_host"],user=di["db_user"],passwd=di["db_password"],db=di["db_name"])@injectclassAbstractRepository:def__init__(self,db_connection):self.connection=db_connectionclassUserRepository(AbstractRepository):...repository=UserRepository()repository.connection# mysql db connection is resolved and available to use.
当类被inject
注释注释时,它将被自动添加到容器中以备将来使用(例如autowiring)。在
服务别名
向@inject
decorator注册服务时,可以附加自己的别名,请考虑以下示例:
fromkinkimportinjectfromtypingimportProtocolclassIUserRepository(Protocol):...@inject(alias=IUserRepository)classUserRepository:...assertdi[IUserRepository]==di[UserRepository]# returns true
有关更多示例,请检查tests目录
- 项目
标签: