一个简单的依赖注入容器
rumple的Python项目详细描述
受Pimple启发的简单依赖注入容器。
安装
使用pip:
# pip install rumple
手动:
$ git clone https://github.com/Komtet/rumple $ cd rumple # python setup.py install
用法
fromrumpleimportContainerc1=Container()c2=Container({'param':'value','service':lambda:object()})
定义服务
fromrumpleimportContainerclassService(object):passclassAnotherService(object):def__init__(self,service):self.service=servicecontainer=Container()container['service']=lambda:Service()container['another_service']=lambdac:AnotherService(c['service'])another_service=container['another_service']assertisinstance(another_service,AnotherService)assertanother_service.serviceiscontainer['service']
定义参数
fromrumpleimportContainercontainer=Container()container['parameter']='value'assertcontainer['parameter']=='value'
扩展服务
fromrumpleimportContainerclassService(object):def__init__(self):self.optional_dependency=Nonedefset_optional_dependency(self,dependency):self.optional_dependency=dependencyclassOptionalDependency(object):passdefextend_service(service,container):# Note: you can omit "container" argumentservice.set_optional_dependency(container['optional_dependency'])returnservicecontainer=Container()container['service']=lambda:Service()container['optional_dependency']=lambda:OptionalDependency()container.extend('service',extend_service)
提供者
fromrumpleimportContainer,extend,share,valueclassProvider(object):@share()defservice(self):returnobject()@share('renamed_service')defanother_service(self):returnobject()@share()defservice_for_extend(self):returnobject()@value()deffirst_option(self):return'value_1'@value('second_option_renamed')defsecond_option(self):return'value_2'@value()def_ignored(self):return'value'classAnotherProvider(object):@extend('service_for_extend')defextend_service(self,service_for_extend):assertisinstance(service_for_extend,object)returnstr(object)classSomeLibProvider(object):__prefix__='some_lib.'@share()defservice(self):returnobject()@extend('some_lib.service')defextend(self,service):returnstr(service)container=Container()container.register(Provider())container.register(AnotherProvider(),{'additional_option':'value1'})container.register(SomeLibProvider(),{'additional_option':'value2'})assertisinstance(container['service'],object)assertisinstance(container['renamed_service'],object)assertisinstance(container['service_for_extend'],str)assertcontainer['first_option']=='value_1'assertcontainer['second_option_renamed']=='value_2'assert'_ignored'notincontainerassertcontainer['additional_option']=='value1'assertisinstance(container['some_lib.service'],str)assertcontainer['some_lib.additional_option']=='value2'
遍历容器
fromrumpleimportContainercontainer=Container({'k1':'v1','k2':'v2'})foritemincontainer:print(item)# Output:# ('k1', 'v1')# ('k2', 'v2')
更改日志
0.2.0(2019年1月25日)
- 能够在提供商中指定供应商前缀
- 修正inspect.getargspec()否决
0.1.0(2015年7月15日)
- 首次发布
贡献
- 分叉并克隆它
- 创建您的功能分支(git checkout-b awesome feature)
- 进行更改
- 如有必要,编写/更新测试
- 必要时更新readme.md
- 推动您的分支(Git Push Origin Awesome功能)
- 发送拉取请求
许可证
麻省理工学院许可证(MIT)