pinject依赖注入模块
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依赖注入模块的更多相关文章
- [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
[.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提供的:单一对象生成.生命周期 ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- Spring.Net依赖注入(属性注入)
一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...
- Spring.Net依赖注入(属性注入)学习笔记
一.前言: Spring.Net是Java开源框架迁移过来的,主要分为 1)依赖注入 2)面向方面编程 3)数据访问抽象 4)Asp.Net扩展 四个模块功能,这里只是简单介绍依赖注入模块功能. 对于 ...
- angular路由 模块 依赖注入
1.模块 var helloModule=angular.module('helloAngular',[]); helloModule.controller('helloNgCrtl',['$scop ...
- 4.了解AngularJS模块和依赖注入
1.模块和依赖注入概述 1.了解模块 AngularJS模块是一种容器,把代码隔离并组织成简洁,整齐,可复用的块. 模块本身不提供直接的功能:包含其他提供功能的对象的实例:控制器,过滤器,服务,动画 ...
- --@angularJS--路由、模块、依赖注入
以下是演示angular路由切换的demo. 主页:index.html <!doctype html><html ng-app="bookStoreApp"&g ...
- 基于ABP模块组件与依赖注入组件的项目插件开发
注意,阅读本文,需要先阅读以下两篇文章,并且对依赖注入有一定的基础. 模块系统:http://www.cnblogs.com/mienreal/p/4537522.html 依赖注入:http://w ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用
再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...
随机推荐
- [转帖]调试springboot数据库系统应用时常用debug日志配置, 解决问题缩小范围时常用
https://www.yihaomen.com/article/1853.html 摘要: 用 spring boot 开发应用时,在遇到麻烦问题时,经常会打开debug日志,下面记录一个通用的思路 ...
- 关于cockpit的学习
关于cockpit的学习 背景 使用node-exporter 可以监控很多资源使用情况 但是这个需要搭建一套prometheus和grafana的工具 并且每个机器都需要安装一套node-expor ...
- Python学习之十九_程序运行时间的验证
Python学习之十九_程序运行时间的验证 背景 最近一段时间比较忙. 而且还遇到了一个lua脚本优化redis访问的场景. 想着自己还在学习python(时断时续) 所以想借着这个场景,学习一下py ...
- [转帖]Nginx-https证书认证详解
https://developer.aliyun.com/article/885650?spm=a2c6h.24874632.expert-profile.306.7c46cfe9h5DxWK 简介: ...
- 说透IO多路复用模型
作者:京东零售 石朝阳 在说IO多路复用模型之前,我们先来大致了解下Linux文件系统.在Linux系统中,不论是你的鼠标,键盘,还是打印机,甚至于连接到本机的socket client端,都是以文件 ...
- drools规则动态化实践
作者:京东物流 李振 康睿 刘斌 王北永 一 . 规则引擎业务应用背景 业务逻辑中经常会有一些冗长的判断,需要写特别多的if else,或者一些判断逻辑需要经常修改.这部分逻辑如果以java代码来实现 ...
- 【小测试】golang中使用string()来转换[]byte数组产生了拷贝
下方是benchmark的数据差异: import ( "reflect" "unsafe" ) // NoAllocString convert []byte ...
- Dubbo3应用开发—Dubbo注册中心引言
Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理. 注册中心的运行流程 使用注册中心的好处 可以有效的 ...
- easyui 使用不同的url以获取不同数据源信息
转载 https://www.bbsmax.com/A/kjdw1x06JN/ https://blog.csdn.net/lixinhui199/article/details/50724081 参 ...
- Docker中Nginx部署go应用
docker配合Nginx部署go应用 Nginx 名词解释 正向代理 反向代理 构建镜像 Nginx镜像 配置nginx.conf server_name Nginx中的负载均衡 轮询 upstre ...