python 3依赖注入的实现

rodi的Python项目详细描述


Build statuspypiTest coverage

python 3依赖注入的实现

功能:

  • 通过签名类型注释进行类型解析(type hints
  • 通过构造函数参数名和别名进行类型解析(convention over configuration
  • 非侵入性:生成对象图,而不需要更改类源代码(与依赖注入的其他一些python实现不同,如inject
  • 构建对象图后,获得服务的最小开销
  • 支持单例、临时和范围服务

这个库的灵感来自.NET标准的Microsoft.Extensions.DependencyInjection实现(ref.MSDN, Dependency injection in ASP.NET CoreUsing dependency injection in a .Net Core console application)。

本文通过Bob GregoryDependency Injection with Type Signatures in Python加强了编写这个库的想法。甚至在读格雷戈里的文章之前,我就分享了他在博客中描述的许多想法。

安装

pip install rodi

非争议性违约

这个库的设计目的是通过构造函数签名中的类型提示和构造函数参数名(约定优于配置)来工作,如下图所述。它对那些喜欢打字暗示的人,那些不喜欢的人,以及那些喜欢两种选择的人都很有用。

Usage option

最小开销

rodi通过在运行时检查\u init方法一次来工作,以生成返回所需类型实例的函数。验证步骤(例如检测循环依赖项或丢失的服务)在构建这些函数时完成,因此在激活服务时不需要额外的验证。

因此,服务首先在container类的实例中注册,该实例实现了返回services实例的方法build\u provider()。然后使用服务提供者按类型或名称获取所需的服务。只有在创建服务提供者的实例时,才会执行检查和验证步骤。

Classes

在下面的例子中,一个单例是由精确的实例注册的。

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和其他优点。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
线程“awteventque0”java中的图像异常。lang.IllegalArgumentException:宽度(1)和高度(1)不能小于等于0   java JodaTime LocalTime到JSON实际堆栈溢出   java Jfree图表更改Y轴数据   java使用Perlin noise生成二维平铺贴图   java如何检测安卓中是否正在录制屏幕   如何在Android中从本机C/C++调用JavaAPI   java在非本地应用程序中将号码添加到iPhone或Android电话联系人列表   java找到最大的子矩阵   对于“偶数团队”代码,java迭代运行得更快   java Spring引导rest终结点返回null并带有获取请求   java将一个字符串插入到另一个字符串中   java我正在尝试向使用我的应用程序的特定用户广播消息?   来自Yml文件的java Spring引导和属性数据   java Gradle在依赖项中复制类   用于Knime中多行的java正则表达式   java访问来自超类的隐藏变量   java如何调用其他EAR的bean方法   java使用命令行更新哪些可用的驱动程序?   java如何允许其他人通过API向类添加自定义枚举   java Android R8在发送到Firebase时复制自定义模型类的字段