通过强大的灵活的依赖注入容器管理您的服务
项目描述
参数
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的类,它可以配置用于发送电子邮件消息的方法(例如sendmail、smtp等)。
但是,如果你想在应用的其他地方使用邮件服务怎么办?你当然不希望在每次需要使用Mailer对象时都重复配置邮件器。如果你需要将transport从sendmail更改为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.class和my_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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2f9e8e2dd59cd9e80f0fd06df77c54f315209568b848f592d3ca6552e837ef55 |
|
MD5 | e790d10448ed6e6a8729a1ca79e650d2 |
|
BLAKE2b-256 | 4e96287792fc63d5cd631e85572aa5511a2fbde7319d1808f91790f36552270e |