mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 01:47:36 +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