跳转到主要内容

通过强大的灵活的依赖注入容器管理您的服务

项目描述

https://travis-ci.org/felixcarmona/pydic.png?branch=master https://coveralls.io/repos/felixcarmona/pydic/badge.png?branch=master Downloads Latest Version

参数

pydic.Parameters 类是一个简单的键/值对容器。

可用方法有

  • set(key, value):设置参数。

  • get(key, default=None):通过名称返回参数。如果键不存在,则返回默认参数。

  • has(key):如果参数存在,返回True,否则返回False

  • remove(key):移除参数。

  • add(parameters):添加参数字典。

  • all():返回所有设置的参数。

  • count():返回所有设置参数的数量。

  • keys():返回所有设置参数的键。

  • parse_text(text):解析包含参数的字符串(例如:'Hello {{ name }} {{ surname }}!')

服务

什么是服务容器

服务容器(或依赖注入容器)本质上是一个Python对象,用于管理服务的实例化(对象)。例如,假设你有一个简单的Python类,用于发送电子邮件。如果没有服务容器,每次需要时都必须手动创建该对象。

from myapplication.mailer import Mailer

mailer = Mailer('sendmail')
mailer.send('felix@example.com', ...)

这很简单。假设有一个名为Mailer的类,它可以配置用于发送电子邮件消息的方法(例如sendmailsmtp等)。

但是,如果你想在应用的其他地方使用邮件服务怎么办?你当然不希望在每次需要使用Mailer对象时都重复配置邮件器。如果你需要将transportsendmail更改为smtp,应用中的每个地方都需要这样做。你需要找到创建Mailer服务的每个地方,并更改它。

服务容器允许你标准化和集中化应用程序中对象的构建方式。

在容器中创建/配置服务

更好的办法是让服务容器为你创建Mailer对象。为了使这成为可能,你必须教会容器如何创建Mailer服务。这是通过配置定义来完成的。

...
from pydic import Services

definitions = {
    'my_mailer': {
        'class':        'myapplication.mailer.Mailer',
        'arguments':    ['sendmail']
    }
}

services = Services(definitions)
...

当你从容器请求my_mailer服务(services.get('my_mailer'))时,容器构建对象并返回它。

这是使用服务容器的另一个主要优势。也就是说,服务只有在需要时才会构建。如果你定义了一个服务但从未使用它,那么服务永远不会创建。这节省了内存并提高了应用程序的速度。这也意味着定义大量服务几乎或不会影响性能。从未使用过的服务永远不会构建。

作为额外的奖励,Mailer服务只会创建一次,每次请求服务时都返回相同的实例。这几乎总是你所需要的(它更灵活、更强大)。

你可以将参数作为列表或字典传递。

你还可以使用以下方式在对象实例化后调用函数

...
definitions = {
    'my_mailer': {
        'class':        'myapplication.mailer.Mailer',
        'arguments':    ['sendmail'],
        'calls': [
            [ 'set_name', 'Felix Carmona'],
            [ 'inject_something',  [1, 2, 3]],
            [ 'inject_something',  [2, 3]],
            [ 'set_location',  {'city': 'Barcelona', 'country': 'Spain'}]
        ]
    }
}
...

容器使用定义构建后,服务容器对象的可用方法有

  • set(key, value):通过名称设置服务对象。

  • get(key):通过名称返回服务对象。

  • has(key):如果服务定义存在或服务对象已实例化,则返回True,否则返回False

  • remove(key):通过名称移除服务对象和服务定义。

  • add(parameters):添加一组服务对象。

  • keys():返回服务键。

使用参数构建服务

通过容器创建新服务(对象)的过程非常简单。参数使服务定义更加有组织和灵活。

...
parameters = Parameters(
    {
        'my_mailer_class':     'myapplication.mailer.Mailer',
        'my_mailer_transport': 'sendmail'
    }
)

definitions = {
    'my_mailer': {
        'class':        '{{ my_mailer_class }}',
        'arguments':    ['{{ my_mailer_transport }}']
    }
}

services = Services(definitions, parameters)
...

最终结果与之前完全相同——区别只在于你如何定义服务。通过将my_mailer.classmy_mailer.transport字符串放在双括号键({{ }})符号中,服务容器知道要查找具有这些名称的参数。参数可以深层引用其他参数,这些参数又引用了其他参数,并且无论如何都会被解析。

参数的目的是将信息输入到服务中。当然,在定义服务时不使用参数也没有什么问题。但是,参数有多个优点:

  • 在单个参数键下对所有的服务“选项”进行分离和组织

  • 参数值可以在多个服务定义中使用

是否使用参数取决于你。

引用(注入)服务

你当然也可以引用服务

字符串开头使用 @ 来引用服务,例如:

...
parameters = Parameters(
    {
        'my_mailer_class':     'myapplication.mailer.Mailer',
        'my_mailer_transport': 'sendmail'
    }
)

definitions = {
    'my_mailer': {
        'class':        '{{ my_mailer_class }}',
        'arguments':    ['{{ my_mailer_transport }}']
    },
    'my_mailer_manager': {}
        'class': 'myapplication.mailer.MailerManager',
        'arguments': ['@my_mailer']
    }
}

services = Services(definitions, parameters)
...

my_mailer 服务将被注入到 my_mailer_manager 中。


pydic 是基于 MIT 许可的开源软件。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码发行版

pydic-1.0.0.tar.gz (5.8 kB 查看哈希值)

上传时间 源代码

由以下支持