:py:class:`Aggregate` provider aggregates a group of other providers.
.. currentmodule:: dependency_injector.providers
.. literalinclude:: ../../examples/providers/aggregate.py :language: python :lines: 3- :emphasize-lines: 24-27
Each provider in the Aggregate
is associated with a key. You can call aggregated providers by providing
their key as a first argument. All positional and keyword arguments following the key will be forwarded to
the called provider:
yaml_reader = container.config_readers("yaml", "./config.yml", foo=...)
You can also retrieve an aggregated provider by providing its key as an attribute name:
yaml_reader = container.config_readers.yaml("./config.yml", foo=...)
To retrieve a dictionary of aggregated providers, use .providers
attribute:
container.config_readers.providers == {
"yaml": <YAML provider>,
"json": <JSON provider>,
}
Note
You can not override the Aggregate
provider.
Note
When you inject the Aggregate
provider, it is passed "as is".
To use non-string keys or string keys with .
and -
, provide a dictionary as a positional argument:
aggregate = providers.Aggregate({
SomeClass: providers.Factory(...),
"key.with.periods": providers.Factory(...),
"key-with-dashes": providers.Factory(...),
})
.. seealso:: :ref:`selector-provider` to make injections based on a configuration value, environment variable, or a result of a callable. ``Aggregate`` provider is different from the :ref:`selector-provider`. ``Aggregate`` provider doesn't select which provider to inject and doesn't have a selector. It is a group of providers and is always injected "as is". The rest of the interface of both providers is similar.
Note
Aggregate
provider is a successor of :ref:`factory-aggregate-provider` provider. Aggregate
provider doesn't have
a restriction on the provider type, while FactoryAggregate
aggregates only Factory
providers.
.. disqus::