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第三方库


热门话题
具有未知数量条件的java If语句   java如何在Spark中使用两个“条件”进行过滤?   雅加达ee为ColdFusion提供的最佳Java ee服务器   java如何在jersey的MessageBodyWriter方法中获取writeTo中的anotations值?   java从脚本文件调用jar文件中的函数   java在执行insert语句后,如何获得id值为的语句?   在OS X上设置OpenCV Java绑定   java使用for循环遍历数组x。以字符串形式返回x的元素,其中每个元素由一个空格分隔   ApacheiClientBuilder为Algolia Java创建的APIClient是线程安全的吗?   java在DFS/BFS算法中获取邻居时避免内存分配?   java使用AES/CBC/PKCS5P加密大文件(2GB)   允许保存/加载列布局的Java DB网格组件   队列大小为1的java Spring调度   跑步带有Java参数的exe   java正则表达式将所有“<”和“>”标记替换为“&lt;”及“&gt;”在<<![CDATA]>标签?   java何时同步变量?