.. currentmodule:: dependency_injector.containers
:py:class:`DeclarativeContainer` is a class-based style of the providers definition.
You create the declarative container subclass, put the providers as attributes and create the container instance.
.. literalinclude:: ../../examples/containers/declarative.py :language: python :lines: 3-
The declarative container providers should only be used when you have the container instance. Working with the providers of the container on the class level will influence all further instances.
The declarative container can not have any methods or any other attributes then providers.
The container class provides next attributes:
providers
- the dictionary of all the container providerscls_providers
- the dictionary of the container providers of the current containerinherited_providers
- the dictionary of all the inherited container providers
.. literalinclude:: ../../examples/containers/declarative_inheritance.py :language: python :lines: 3-
Injections in the declarative container are done the usual way:
.. literalinclude:: ../../examples/containers/declarative_injections.py :language: python :lines: 3-
You can override container providers while creating a container instance:
.. literalinclude:: ../../examples/containers/declarative_override_providers.py :language: python :lines: 3- :emphasize-lines: 13
Alternatively, you can call container.override_providers()
method when the container instance
already exists:
container = Container()
container.override_providers(foo=mock.Mock(Foo), bar=mock.Mock(Bar))
assert isinstance(container.foo(), mock.Mock)
assert isinstance(container.bar(), mock.Mock)
You can also use container.override_providers()
with a context manager to reset
provided overriding after the context is closed:
container = Container()
with container.override_providers(foo=mock.Mock(Foo), bar=mock.Mock(Bar)):
assert isinstance(container.foo(), mock.Mock)
assert isinstance(container.bar(), mock.Mock)
assert isinstance(container.foo(), Foo)
assert isinstance(container.bar(), Bar)
.. disqus::