pyjection是一个轻量级的python依赖注入库

pyjection的Python项目详细描述


Software LicenseBuild StatusCode CoverageCode Quality

pyjection是一个轻量级的python依赖注入库

基本依赖注入

最重要的导入类是DependencyInjector,它允许我们注册类并检索实例。

frompyjection.dependency_injectorimportDependencyInjectorclassOuterClass(object):def__init__(self,inner_class):self.inner_class=inner_classclassInnerClass(object):def__init__(self):self.foo="bar"container=DependencyInjector()container.register(InnerClass)container.register(OuterClass)outer=container.get("outer_class")print(outer.inner_class.foo)# Will print "bar"

类绑定

隐式类绑定

当在register方法中未指定id时,pyjection将为类创建隐式绑定。 隐式绑定假定您的代码遵循pep8约定:您的类在CamelCase中命名, 你的参数在lower_with_underscores中命名。Pinject变换 类名到可注入的arg名称(通过小写并连接它们) 带下划线。

Class nameArg name
^{tt5}$^{tt6}$
^{tt7}$^{tt8}$

显式类绑定

也可以在注册期间通过将类指定为第二个参数来手动设置该类的id。

container.register(FooClass,"inner_class")

在上面的例子中,FooClass稍后将被注入到名为inner_class

的参数中。

实例检索

要从依赖项注入器检索类的实例,可以在get方法中使用2个选项:

  • 将类的lower_with_underscores名称指定为字符串
  • 将类作为参数
frompyjection.dependency_injectorimportDependencyInjectorclassFooClass(object):passcontainer=DependencyInjector()container.register(FooClass)container.get("foo_class")# Same ascontainer.get(FooClass)

单次喷射

依赖注入程序允许我们注册一个单实例。 要注册单例,可以使用方法register_singleton。 它接受与register相同的参数。

frompyjection.dependency_injectorimportDependencyInjectorclassSingletonClass(object):passcontainer=DependencyInjector()container.register_singleton(SingletonClass)# Or we could specify an idcontainer.register_singleton(SingletonClass,"other_id")class_1=container.get("other_id")class_2=container.get("other_id")print(class_1isclass_2)# True

显式参数规范

简单参数规范

有时我们需要注入的参数不是类的实例。 registerregister_singleton方法返回一个服务对象,该对象允许我们使用add_argument方法指定要绑定到给定参数的内容。

frompyjection.dependency_injectorimportDependencyInjectorclassFooClass(object):def__init__(self,foo):self.foo=foocontainer=DependencyInjector()service=container.register(FooClass)service.add_argument("foo","bar")foo_class=container.get("foo_class")print(foo_class.foo)# Will print bar

参考参数规范

服务参数还可以引用另一个依赖项注入器服务。 当我们要注入一个与参数名不匹配的类时,它很有用。

frompyjection.dependency_injectorimportDependencyInjectorfrompyjection.referenceimportReferenceclassOuterClass(object):def__init__(self,inner_class):self.inner_class=inner_classclassFooClass(object):def__init__(self):self.foo="bar"container=DependencyInjector()container.register(FooClass)container.register(OuterClass).add_argument("inner_class",Reference('foo_class'))instance=container.get(OuterClass)print(instance.inner_class.foo)# Will print bar

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

推荐PyPI第三方库


热门话题
java如何在删除后修复recyclerView中的项目重复?   java如何在Android中使用Handle而不增加内存   java(i>>>距离)是如何工作的   java如何在菜单项操作之后删除JTabbedPane的内容   springintermediatejavax。ejb。EJBException:java。Jboss应用程序中的lang.NullPointerException   Java:派生类中的方法链接   java InputListener不适用于正交摄影机和角色   java不能写这个方法吗?   java为什么Apache Kafka消费者不使用来自主题的消息?   使用scanner Java从文本文件填充二维数组   爪哇在会场内放置标记   maven合并了2个Java web应用程序   Java中注释处理的缺点是什么?   java创建在JFrame中绘制矩形和圆形的方法?   java LibGDX应用程序挂起在initializeglfw()上   唯一包含密钥但在不同字段上排序的java集   jboss在使用Infinispan中的共享文件存储时获取“java.io.IOException:不支持的协议版本22”   JavaEclipse似乎不想编译我的类的新版本。即使在(我认为)修复它之后,我也会遇到同样的错误