mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-05-22 21:46:17 +03:00
Add docs and examples
This commit is contained in:
parent
385437e2d4
commit
39c2ffbc13
|
@ -23,3 +23,4 @@ Containers module API docs - :py:mod:`dependency_injector.containers`.
|
|||
dynamic
|
||||
specialization
|
||||
overriding
|
||||
traversal
|
||||
|
|
33
docs/containers/traversal.rst
Normal file
33
docs/containers/traversal.rst
Normal file
|
@ -0,0 +1,33 @@
|
|||
Container providers traversal
|
||||
-----------------------------
|
||||
|
||||
To traverse container providers use method ``.traverse()``.
|
||||
|
||||
.. literalinclude:: ../../examples/containers/traverse.py
|
||||
:language: python
|
||||
:lines: 3-
|
||||
:emphasize-lines: 38
|
||||
|
||||
Method ``.traverse()`` returns a generator. Traversal generator visits all container providers.
|
||||
This includes nested providers even if they are not present on the root level of the container.
|
||||
|
||||
Traversal generator guarantees that each container provider will be visited only once.
|
||||
It can traverse cyclic provider graphs.
|
||||
|
||||
Traversal generator does not guarantee traversal order.
|
||||
|
||||
You can use ``types=[...]`` argument to filter providers. Traversal generator will only return
|
||||
providers matching specified types.
|
||||
|
||||
.. code-block:: python
|
||||
:emphasize-lines: 3
|
||||
|
||||
container = Container()
|
||||
|
||||
for provider in container.traverse(types=[providers.Resource]):
|
||||
print(provider)
|
||||
|
||||
# <dependency_injector.providers.Resource(<function init_database at 0x10bd2cb80>) at 0x10d346b40>
|
||||
# <dependency_injector.providers.Resource(<function init_cache at 0x10be373a0>) at 0x10d346bc0>
|
||||
|
||||
.. disqus::
|
|
@ -9,6 +9,7 @@ follows `Semantic versioning`_
|
|||
|
||||
Development version
|
||||
-------------------
|
||||
- Add container providers traversal.
|
||||
- Add ``.provides`` attribute to ``Singleton`` and its subclasses.
|
||||
It's a consistency change to make ``Singleton`` match ``Callable``
|
||||
and ``Factory`` interfaces.
|
||||
|
|
48
examples/containers/traverse.py
Normal file
48
examples/containers/traverse.py
Normal file
|
@ -0,0 +1,48 @@
|
|||
"""Container traversal example."""
|
||||
|
||||
from dependency_injector import containers, providers
|
||||
|
||||
|
||||
def init_database():
|
||||
return ...
|
||||
|
||||
|
||||
def init_cache():
|
||||
return ...
|
||||
|
||||
|
||||
class Service:
|
||||
def __init__(self, database, cache):
|
||||
self.database = database
|
||||
self.cache = cache
|
||||
|
||||
|
||||
class Container(containers.DeclarativeContainer):
|
||||
|
||||
config = providers.Configuration()
|
||||
|
||||
service = providers.Factory(
|
||||
Service,
|
||||
database=providers.Resource(
|
||||
init_database,
|
||||
url=config.database_url,
|
||||
),
|
||||
cache=providers.Resource(
|
||||
init_cache,
|
||||
hosts=config.cache_hosts,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
container = Container()
|
||||
|
||||
for provider in container.traverse():
|
||||
print(provider)
|
||||
|
||||
# <dependency_injector.providers.Configuration('config') at 0x10d37d200>
|
||||
# <dependency_injector.providers.Factory(<class '__main__.Service'>) at 0x10d3a2820>
|
||||
# <dependency_injector.providers.Resource(<function init_database at 0x10bd2cb80>) at 0x10d346b40>
|
||||
# <dependency_injector.providers.ConfigurationOption('config.cache_hosts') at 0x10d37d350>
|
||||
# <dependency_injector.providers.Resource(<function init_cache at 0x10be373a0>) at 0x10d346bc0>
|
||||
# <dependency_injector.providers.ConfigurationOption('config.database_url') at 0x10d37d2e0>
|
Loading…
Reference in New Issue
Block a user