pinject 是一个基于 Python 的轻量级依赖注入库,可以方便地实现依赖注入的功能。
下面我们将通过一个简单的示例来演示如何使用 pinject 实现依赖注入。 首先,我们需要安装 pinject 库: pip install pinject
接下来,我们创建两个类:一个名为 EmailSender 的邮件发送器类,另一个名为 NewsletterManager 的新闻通讯管理器类。
其中,NewsletterManager 类依赖于 EmailSender 类,因为它需要调用 EmailSender.send_email() 方法来发送邮件。 python
class EmailSender:
def send_email(self, to_addr: str, subject: str, body: str):
print(f"Sending email to {to_addr}\nSubject: {subject}\nBody: {body}") class NewsletterManager:
def __init__(self, email_sender: EmailSender):
self.email_sender = email_sender def send_newsletter(self, recipients: List[str], subject: str, body: str):
for recipient in recipients:
self.email_sender.send_email(recipient, subject, body)
然后,我们使用 pinject 注册这两个类,并使用 inject 装饰器来实现依赖注入。
inject 装饰器将自动检测所有参数类型,并尝试为其注入合适的实例。 import pinject class AppModule(pinject.BindingSpec):
@pinject.provider
def provide_email_sender(self) -> EmailSender:
return EmailSender() @pinject.provider
def provide_newsletter_manager(self, email_sender: EmailSender) -> NewsletterManager:
return NewsletterManager(email_sender) class App:
@pinject.inject
def __init__(self, newsletter_manager: NewsletterManager):
self.newsletter_manager = newsletter_manager if __name__ == '__main__':
obj_graph = pinject.new_object_graph(binding_specs=[AppModule])
app = obj_graph.provide(App) recipients = ['alice@example.com', 'bob@example.com']
app.newsletter_manager.send_newsletter(recipients, 'Newsletter', 'Hello from our company!')
在这个示例中,我们定义了名为 AppModule 的类,
并使用 pinject.provider 装饰器定义了两个提供者方法:provide_email_sender() 和 provide_newsletter_manager()。
provide_email_sender() 方法返回一个新的 EmailSender 实例;provide_newsletter_manager() 方法接受一个 EmailSender 参数并返回一个新的 NewsletterManager 实例。 然后,我们定义了一个名为 App 的类,并使用 pinject.inject 装饰器将其构造函数标记为可注入的。
在 App 类的构造函数中,我们注入了一个 NewsletterManager 实例,并将其存储在 self.newsletter_manager 属性中。 在主程序中,我们首先创建了一个 AppModule 实例,并通过 new_object_graph() 方法创建了一个新的对象图。
然后,我们调用 obj_graph.provide() 方法来创建一个新的 App 实例,并将其存储在 app 变量中。
最后,我们调用 app.newsletter_manager.send_newsletter() 方法来发送新闻通讯邮件。 在这个示例中,pinject 自动检测到 NewsletterManager 的构造函数需要一个 EmailSender 实例,
并使用 provide_email_sender() 方法提供了一个合适的实例。这样,我们就实现了依赖注入的功能。

pinject依赖注入模块的更多相关文章

  1. [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)

    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...

  2. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  3. Spring.Net依赖注入(属性注入)

    一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...

  4. Spring.Net依赖注入(属性注入)学习笔记

    一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...

  5. angular路由 模块 依赖注入

    1.模块 var helloModule=angular.module('helloAngular',[]); helloModule.controller('helloNgCrtl',['$scop ...

  6. 4.了解AngularJS模块和依赖注入

    1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...

  7. --@angularJS--路由、模块、依赖注入

    以下是演示angular路由切换的demo. 主页:index.html <!doctype html><html ng-app="bookStoreApp"&g ...

  8. 基于ABP模块组件与依赖注入组件的项目插件开发

    注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...

  9. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  10. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

随机推荐

  1. [转帖]关于kafka压力测试(使用官方自带脚本测试)

    文章目录 kafka官方自带压测脚本文件 Producer生产者环境测试 测试命令 返回测试结果 Consumer消费者环境测试 测试命令 测试结果说明 提升kafka的吞吐量 可通过以下的方式来提升 ...

  2. [转帖]ethtool 命令介绍

    https://www.jianshu.com/p/f456e73a0437 name ethtool - query or control network driver and hardware s ...

  3. [转帖]window10下如何安装fio

    1.fio下载地址(实测有效): https://github.com/axboe/fio/releaseshttps://github.com/axboe/fio/releases 其他的地址如​​ ...

  4. VM PowerCli的简单安装和使用学习

    1. Win10 上面安装 下载 zip包并且进行安装 win10 已经带了powershell 安装比较简单, 只不过安装时会提示 powershell的权限有问题需要打开powershell 执行 ...

  5. Mysql 安装文件下载

    今天上了mysql的官方网站想下载mysql数据库 https://www.mysql.com 注册之后发现 出口许可证的问题 这里fxxk 一下川建国的老婆和女儿 感觉比较抑郁 然后就去百度了下 发 ...

  6. CentOS7上面一键部署rabbitmq的简单方法

    1. rabbitmq的安装部署比redis之类的要麻烦一些. 主要是他是基于erlang写的 而不是基于c或者是c++写的 2. 很多时候编译需要添加很多组件, 但是一些机器可能不会让添加这么多的组 ...

  7. pytest-assume插件-多重校验

    自动化接口测试我们通常会对一条case设置多条断言,这样就会出现一个问题,如果前面一 个校验不通过,那么后面的校验就不会走到,如下图,可以看到校验走到assert False就不往 下走了,这个时候p ...

  8. LeetCode刷题日记 2020/03/26

    题干 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  9. Gin 中间件

    中间件 在Gin框架中,中间件(Middleware)指的是可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个 ...

  10. Properties集合的使用

    Properties集合是唯一一个可以和IO流相结合的集合 可以将集合中的数据持久化存储,也可以将硬盘上的数据加载到该集合中. 1 Properties集合添加.遍历 1 private static ...