python-dependency-injector/docs/providers/overriding.rst

54 lines
1.8 KiB
ReStructuredText
Raw Normal View History

2015-07-21 09:57:13 +03:00
Overriding of providers
-----------------------
2015-11-30 00:30:48 +03:00
.. currentmodule:: dependency_injector.providers
2015-11-23 18:02:48 +03:00
2015-07-21 09:57:13 +03:00
Every provider could be overridden by another provider.
This gives opportunity to make system behaviour more flexible in some points.
The main feature is that while your code is using providers, it depends on
providers, but not on the objects that providers provide. As a result of this,
you can change providing by provider object to a different one, but still
compatible one, without chaning your previously written code.
Provider overriding functionality has such interface:
2015-09-02 18:14:13 +03:00
.. image:: /images/providers/provider_override.png
:width: 45%
:align: center
2015-11-23 18:02:48 +03:00
+ :py:meth:`Provider.override()` - takes another provider that will be used
2015-09-02 18:14:13 +03:00
instead of current provider. This method could be called several times.
In such case, last passed provider would be used as overriding one.
2015-11-23 18:02:48 +03:00
+ :py:meth:`Provider.reset_override()` - resets all overriding providers.
Provider starts to behave itself like usual.
+ :py:attr:`Provider.is_overridden` - bool, ``True`` if provider is overridden.
.. note::
Actually, initial provider forms stack from overriding providers. There is
some, not so common, but still usefull, functionality that could be used:
2015-11-23 18:02:48 +03:00
+ :py:attr:`Provider.last_overriding` - always keeps reference to last
2015-09-02 18:14:13 +03:00
overriding provider.
2015-11-23 18:02:48 +03:00
+ :py:meth:`Provider.reset_last_overriding()` - remove last overriding
provider from stack of overriding providers.
Example:
.. image:: /images/providers/overriding_simple.png
:width: 80%
:align: center
.. literalinclude:: ../../examples/providers/overriding_simple.py
:language: python
Example:
.. image:: /images/providers/overriding_users_model.png
:width: 100%
:align: center
.. literalinclude:: ../../examples/providers/overriding_users_model.py
:language: python