mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-30 23:47:40 +03:00 
			
		
		
		
	Adding docs about writing custom providers
This commit is contained in:
		
							parent
							
								
									06d66b87e9
								
							
						
					
					
						commit
						bc39251426
					
				
							
								
								
									
										
											BIN
										
									
								
								docs/images/providers/custom_provider.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								docs/images/providers/custom_provider.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 30 KiB | 
							
								
								
									
										73
									
								
								docs/providers/custom.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								docs/providers/custom.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,73 @@ | |||
| Writing custom providers | ||||
| ------------------------ | ||||
| 
 | ||||
| List of *Objects* 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 - | ||||
|        ``objects.providers.Provider``. | ||||
|     2. Cusom provider's ``__init__()`` could be overriden with only condition:  | ||||
|        parent initializer (``objects.providers.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 ``objects.providers.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 *Objects* does). It can save some memory. | ||||
|     6. If custom provider deals with injections (e.g. ``Factory``,  | ||||
|        ``Singleton`` providers), it is strongly recommended to use  | ||||
|        ``objects.injections.Injection`` and its subclasses: | ||||
|        ``objects.injections.KwArg``, ``objects.injections.Attribute`` and  | ||||
|        ``objects.injections.Method``.  | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| .. image:: /images/providers/custom_provider.png | ||||
|     :width: 100% | ||||
|     :align: center | ||||
| 
 | ||||
| .. code-block:: python | ||||
| 
 | ||||
|     """Custom `Factory` example.""" | ||||
| 
 | ||||
|     from objects.providers import Provider | ||||
|     from objects.providers import Factory | ||||
| 
 | ||||
| 
 | ||||
|     class User(object): | ||||
| 
 | ||||
|         """Example class User.""" | ||||
| 
 | ||||
| 
 | ||||
|     class UsersFactory(Provider): | ||||
| 
 | ||||
|         """Example users factory.""" | ||||
| 
 | ||||
|         __slots__ = ('_factory',) | ||||
| 
 | ||||
|         def __init__(self): | ||||
|             """Initializer.""" | ||||
|             self._factory = Factory(User) | ||||
|             super(UsersFactory, self).__init__() | ||||
| 
 | ||||
|         def _provide(self, *args, **kwargs): | ||||
|             """Return provided instance.""" | ||||
|             return self._factory(*args, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
|     # Users factory: | ||||
|     users_factory = UsersFactory() | ||||
| 
 | ||||
|     # Creating several User objects: | ||||
|     user1 = users_factory() | ||||
|     user2 = users_factory() | ||||
| 
 | ||||
|     # Making some asserts: | ||||
|     assert isinstance(user1, User) | ||||
|     assert isinstance(user2, User) | ||||
|     assert user1 is not user2 | ||||
| 
 | ||||
							
								
								
									
										38
									
								
								examples/providers/custom_factory.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								examples/providers/custom_factory.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | |||
| """Custom `Factory` example.""" | ||||
| 
 | ||||
| from objects.providers import Provider | ||||
| from objects.providers import Factory | ||||
| 
 | ||||
| 
 | ||||
| class User(object): | ||||
| 
 | ||||
|     """Example class User.""" | ||||
| 
 | ||||
| 
 | ||||
| class UsersFactory(Provider): | ||||
| 
 | ||||
|     """Example users factory.""" | ||||
| 
 | ||||
|     __slots__ = ('_factory',) | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         """Initializer.""" | ||||
|         self._factory = Factory(User) | ||||
|         super(UsersFactory, self).__init__() | ||||
| 
 | ||||
|     def _provide(self, *args, **kwargs): | ||||
|         """Return provided instance.""" | ||||
|         return self._factory(*args, **kwargs) | ||||
| 
 | ||||
| 
 | ||||
| # Users factory: | ||||
| users_factory = UsersFactory() | ||||
| 
 | ||||
| # Creating several User objects: | ||||
| user1 = users_factory() | ||||
| user2 = users_factory() | ||||
| 
 | ||||
| # Making some asserts: | ||||
| assert isinstance(user1, User) | ||||
| assert isinstance(user2, User) | ||||
| assert user1 is not user2 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user