pyjection是一个轻量级的python依赖注入库
pyjection的Python项目详细描述
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 name | Arg 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
显式参数规范
简单参数规范
有时我们需要注入的参数不是类的实例。 register和register_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