一个简单、轻量级的python依赖注入容器(ioc),灵感来自pimple
medle的Python项目详细描述
Medley是一个简单、轻量级的依赖注入容器,用于 Python,灵感来自Pimple。
安装
使用pip安装混合泳
$ pip install medley
用法
通过创建MedleyContainer实例来构建容器:
frommedleyimportMedleyContainercontainer=MedleyContainer()
Medley管理两种不同的数据:services和 参数。
定义服务
服务是作为更大系统的一部分执行某些操作的对象。 服务示例:数据库连接、模板引擎或 梅勒。几乎任何global对象都可以是服务。
服务由返回 对象的实例:
使用lambdas的示例:
# define some servicescontainer['session_storage']=lambdac:SessionStorage('SESSION_ID')container['session']=lambdac:Session(c['session_storage'])
注意,服务定义函数确实需要容器 争论。lambdas必须有权访问当前容器实例, 允许引用其他服务或参数。
也可以使用service decorator将定义的函数包装为 服务
@container.service('session_storage')defsession_storage(c):returnSessionStorage('SESSION_ID')@container.service('session')defsession(c):returnSession(c['session_storage'])
对象是lazy loaded,因此定义服务的顺序 没关系。
获得定义的服务很容易:
session=container['session']# the above call is roughly equivalent to the following code:# storage = SessionStorage('SESSION_ID')# session = Session(storage)
定义工厂服务
默认情况下,每次获得服务时,medley都会返回相同的 它的实例。如果要为返回另一个实例 所有调用,用factory()方法包装匿名函数
container['session']=container.factory(lambdac:Session(c['session_storage']))# you may also use a decorator@container.create_factory('session')defsession(c):returnSession(c['session_storage'])
现在,对container['session']的每个调用都返回 会议。
定义参数
定义参数可以简化容器的配置 从外部存储全局值:
# define some parameterscontainer['cookie_name']='SESSION_ID';container['session_storage_class']=container.protect(SessionStorage);
如果您更改session_storage服务定义如下:
container['session_storage']=lambdac:c['session_storage_class'](c['cookie_name'])
现在可以通过重写 cookie_name参数,而不是重新定义服务定义。
保护参数
因为Medley将所有可调用项都视为服务定义,所以需要将 使用protect()方法将其存储为参数的可调用函数。
fromrandomimportrandomcontainer['random_func']=container.protect(lambda:random())# class types also need to be protectedcontainer['session_storage_class']=container.protect(SessionStorage);
定义后修改服务
在某些情况下,您可能希望在服务定义 已定义。您可以使用extend()方法来定义 创建服务后要在其上运行的代码:
container['session_storage']=lambdac:c['session_storage_class'](c['cookie_name'])container.extend('session_storage',lambdastorage,c:storage.some_call()
lambda的第一个参数是要扩展的服务的名称, 第二个是访问对象实例和 集装箱。
当 扩展定义,特别是在需要修改服务时 并返回
@container.service('session_storage')defsession_storage(c):returnc['session_storage_class'](c['cookie_name'])@container.extends('session_storage')defextended_session_storage(storage,c):storage.some_call()returnstorage
扩展容器
您可以使用提供者使用medley构建一组库。你 可能希望在一个项目到下一个项目之间重用一些服务; 通过实现 medley.ServiceProviderInterface:
frommedleyimportMedleyContainer,ServiceProviderInterfaceclassFooProvider(ServiceProviderInterface):defregister(container:MedleyContainer):# register some services and parameters on containercontainer['foo']=lambdac:return'bar'
然后,在MedleyContainer上注册提供者:
container.register(FooProvider())
获取服务创建函数
当您通过container['some_id']访问对象时,medley 自动调用您定义的函数,该函数创建 为您服务的对象。如果你想直接访问这个函数, 您可以使用raw()方法:
container['session']=lambdac:Session(c['session_storage'])session_function=container.raw('session')