mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-26 03:23:58 +03:00
Update docs about writing custom providers
This commit is contained in:
parent
ef5c360a30
commit
54da9913eb
Binary file not shown.
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 28 KiB |
|
@ -6,26 +6,22 @@ List of *Dependency Injector* providers could be widened with custom providers.
|
|||
Below are some tips and recommendations that have to be met:
|
||||
|
||||
1. Every custom provider has to extend base provider class -
|
||||
``dependency_injector.providers.Provider``.
|
||||
``di.Provider``.
|
||||
2. Cusom provider's ``__init__()`` could be overriden with only condition:
|
||||
parent initializer
|
||||
(``dependency_injector.providers.Provider.__init__()``) has to be called.
|
||||
parent initializer (``di.Provider.__init__()``) has to be called.
|
||||
3. Providing strategy has to be implemented in custom provider's
|
||||
``_provide()`` method. All ``*args`` & ``**kwargs`` that will be
|
||||
recieved by ``dependency_injector.providers.Provider.__call__()`` will be
|
||||
transefed
|
||||
to custom provider's ``_provide()``.
|
||||
recieved by ``di.Provider.__call__()`` will be transefed to custom
|
||||
provider's ``_provide()``.
|
||||
4. If custom provider is based on some standard providers, it is better to
|
||||
use delegation of standard providers, then extending of them.
|
||||
5. If custom provider defines any attributes, it is good to list them in
|
||||
``__slots__`` attribute (as *Dependency Injector* does). It can save
|
||||
some memory.
|
||||
6. If custom provider deals with injections (e.g. ``Factory``,
|
||||
``Singleton`` providers), it is strongly recommended to use
|
||||
``dependency_injector.injections.Injection`` and its subclasses:
|
||||
``dependency_injector.injections.KwArg``,
|
||||
``dependency_injector.injections.Attribute`` and
|
||||
``dependency_injector.injections.Method``.
|
||||
6. If custom provider deals with injections (e.g. ``di.Factory``,
|
||||
``di.Singleton`` providers), it is strongly recommended to be
|
||||
consistent with ``di.Factory``, ``di.Singleton`` and ``di.Callable``
|
||||
providers style.
|
||||
|
||||
Example:
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
"""Custom `Factory` example."""
|
||||
"""Custom `di.Factory` example."""
|
||||
|
||||
from dependency_injector.providers import Provider
|
||||
from dependency_injector.providers import Factory
|
||||
import dependency_injector as di
|
||||
|
||||
|
||||
class User(object):
|
||||
|
@ -9,7 +8,7 @@ class User(object):
|
|||
"""Example class User."""
|
||||
|
||||
|
||||
class UsersFactory(Provider):
|
||||
class UsersFactory(di.Provider):
|
||||
|
||||
"""Example users factory."""
|
||||
|
||||
|
@ -17,7 +16,7 @@ class UsersFactory(Provider):
|
|||
|
||||
def __init__(self):
|
||||
"""Initializer."""
|
||||
self._factory = Factory(User)
|
||||
self._factory = di.Factory(User)
|
||||
super(UsersFactory, self).__init__()
|
||||
|
||||
def _provide(self, *args, **kwargs):
|
||||
|
|
Loading…
Reference in New Issue
Block a user