一个简单、轻量级的python依赖注入容器(ioc),灵感来自pimple

medle的Python项目详细描述


Medley是一个简单、轻量级的依赖注入容器,用于 Python,灵感来自Pimple

要求

混合泳要求python>;=2.7或python>;=3.2

https://travis-ci.org/illumine-interactive/medley.svg?branch=master

安装

使用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')

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

推荐PyPI第三方库


热门话题
java如何创建比较器   java将所有接口读入列表   java Android Studio在Webview中隐藏特定URL的操作栏   java如何在春季从云存储中生成URL文件而无需持续时间   icalendar如何使用Java以日历格式发送ics电子邮件附件?   如果textfield包含数字,则在运行时进行java检查   java util日志属性中何时需要“.level”?   java在一个字符串中显示json   跨平台日志系统的java Log4j替代方案   coldfusion在Lucee上安装Cassandra Java驱动程序   SpringWebMVC4Java配置不工作   windows使用java程序添加环境变量,并且能够在我从计算机打开“环境”选项卡时看到   java未设置变量和方法   mysql在java中通过查询更改数据库的现有行   java如何使用递归方法查找所有可能的数字   java如何使非原语类成员不可变   java将信息从输入按钮传递到标签