dependency-injector:如何为配置值设置回退并注入DeclarativeContainer服务?
在dependency-injector中实现配置值的回退逻辑
问题背景
需要实现等价于以下Python代码的配置回退逻辑,并将值注入到provider.DeclarativeContainer定义的服务中:
value = config.get("value", config.get("fallback", "default"))
可行实现方案
1. 容器内通过Factory封装回退逻辑
直接在容器中定义Factory provider来处理回退逻辑,再将结果注入服务:
from dependency_injector import containers, providers class MyService: def __init__(self, some_value): self.some_value = some_value class Container(containers.DeclarativeContainer): # 加载配置源(支持环境变量、字典、YAML等多种形式) config = providers.Configuration() # 封装回退逻辑的provider resolved_value = providers.Factory( lambda cfg: cfg.get("value", cfg.get("fallback", "default")), config=config ) # 将处理后的值注入目标服务 my_service = providers.Factory( MyService, some_value=resolved_value )
2. 属性访问结合严谨判断(适配配置对象的属性式访问)
如果你的配置是通过属性方式访问(比如config.value),可以用判断语句避免0、""这类假值被误覆盖:
class Container(containers.DeclarativeContainer): config = providers.Configuration() my_service = providers.Factory( MyService, some_value=providers.Factory( lambda cfg: ( cfg.value if hasattr(cfg, "value") else cfg.fallback if hasattr(cfg, "fallback") else "default" ), config=config ) )
3. 预处理配置后再传入容器
在加载配置源阶段提前完成回退逻辑处理,再将处理后的配置传入容器:
from dependency_injector import containers, providers import yaml # 加载原始配置文件 with open("config.yaml", "r") as f: raw_config = yaml.safe_load(f) # 提前处理回退逻辑 raw_config["value"] = raw_config.get("value", raw_config.get("fallback", "default")) # 初始化容器并传入处理后的配置 class Container(containers.DeclarativeContainer): config = providers.Configuration() my_service = providers.Factory(MyService, some_value=config.value) container = Container() container.config.from_dict(raw_config)
内容的提问来源于stack exchange,提问作者zwirbeltier
相关产品推荐
相关产品推荐

