python 3依赖注入的实现
rodi的Python项目详细描述
python 3依赖注入的实现
功能:
- 通过签名类型注释进行类型解析(type hints)
- 通过构造函数参数名和别名进行类型解析(convention over configuration)
- 非侵入性:生成对象图,而不需要更改类源代码(与依赖注入的其他一些python实现不同,如inject)
- 构建对象图后,获得服务的最小开销
- 支持单例、临时和范围服务
这个库的灵感来自.NET标准的Microsoft.Extensions.DependencyInjection
实现(ref.MSDN, Dependency injection in ASP.NET Core,Using dependency injection in a .Net Core console application)。
本文通过Bob Gregory:Dependency Injection with Type Signatures in Python加强了编写这个库的想法。甚至在读格雷戈里的文章之前,我就分享了他在博客中描述的许多想法。
安装
pip install rodi
非争议性违约
这个库的设计目的是通过构造函数签名中的类型提示和构造函数参数名(约定优于配置)来工作,如下图所述。它对那些喜欢打字暗示的人,那些不喜欢的人,以及那些喜欢两种选择的人都很有用。
最小开销
rodi
通过在运行时检查\u init方法一次来工作,以生成返回所需类型实例的函数。验证步骤(例如检测循环依赖项或丢失的服务)在构建这些函数时完成,因此在激活服务时不需要额外的验证。
因此,服务首先在container类的实例中注册,该实例实现了返回services实例的方法build\u provider()。然后使用服务提供者按类型或名称获取所需的服务。只有在创建服务提供者的实例时,才会执行检查和验证步骤。
在下面的例子中,一个单例是由精确的实例注册的。
container=Container()container.add_instance(Cat("Celine"))services=container.build_provider()# --> validation, generation of functionscat=services.get(Cat)assertcatisnotNoneassertcat.name=="Celine"
使用寿命:
- Singleton-每个服务提供商仅实例化一次
- 瞬态-服务在每次需要时都会被实例化
- 作用域-每个服务解析仅实例化一次(根调用,例如每个web请求一次)
文档
有关文档和示例,请参阅wiki in GitHub, https://github.com/RobertoPrevato/rodi/wiki。
在本地开发和运行测试
pip install -r dev_requirements.txt
# run tests using automatic discovery:
pytest
azure devops中的公共项目
https://dev.azure.com/robertoprevato/rodi-在这里查看azure devops中的项目,包含builds和其他优点。