python-dependency-injector/docs/providers/provided_instance.rst
Roman Mogylatov cf862fe8b5
Provided attributes (#282)
* Add sketch

* Cythonize MethodCaller

* Cythonize ItemGetter, AttributeGetter & ProvidedInstance providers

* Add docblock for .provided attribute

* Refactor repr methods

* Add .provided attribute to the Dependency provider

* Add tests for the .provided attribute to the majority of the providers

* Add docblock for the ProvidedInstance provider

* Add docblocks for the rest of the providers

* Add example of the provided instance usage

* Add tests for provided instance* providers

* Add complex provided instance example

* Update example provided_instance.py

* Add docs
2020-08-20 21:52:12 -04:00

65 lines
2.2 KiB
ReStructuredText

Injecting attributes, items, or call methods of the provided instance
---------------------------------------------------------------------
.. currentmodule:: dependency_injector.providers
In this section you will know how to inject provided instance attribute or item into the other
provider.
It also describes how to call a method of the provided instance and use the result of
this call as an injection value.
.. literalinclude:: ../../examples/providers/provided_instance.py
:language: python
:emphasize-lines: 26-32
:lines: 3-
To use the feature you should use the ``.provided`` attribute of the injected provider. This
attribute helps to specify what happens with the provided instance. You can retrieve an injection
value from:
- an attribute of the provided instance
- an item of the provided instance
- a call of the provided instance method
When you use the call of the provided instance method you can specify the injections into this
method like you do with any other provider.
You can do nested constructions:
.. literalinclude:: ../../examples/providers/provided_instance_complex.py
:language: python
:emphasize-lines: 24-30
:lines: 3-
Attribute ``.provided`` is available for the providers that return instances. Providers that
have ``.provided`` attribute:
- :py:class:`Callable` and its subclasses
- :py:class:`Factory` and its subclasses
- :py:class:`Singleton` and its subclasses
- :py:class:`Object`
- :py:class:`List`
- :py:class:`Selector`
- :py:class:`Dependency`
Special providers like :py:class:`Configuration` or :py:class:`Delegate` do not have the
``.provided`` attribute.
Provider subclasses
-------------------
When you create a new provider subclass and want to implement the ``.provided`` attribute, you
should use the :py:class:`ProvidedInstance` provider.
.. code-block:: python
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
In all other cases you should not use :py:class:`ProvidedInstance`, :py:class:`AttributeGetter`,
:py:class:`ItemGetter`, or :py:class:`MethodCaller` providers directly. Use the ``.provided``
attribute of the injected provider instead.