mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 18:07:44 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""`Chained Factories` pattern."""
 | 
						|
 | 
						|
from dependency_injector import providers
 | 
						|
 | 
						|
from data import (
 | 
						|
    id_generator,
 | 
						|
    session,
 | 
						|
    SqlAlchemyDatabaseService,
 | 
						|
    TokensService,
 | 
						|
    Token,
 | 
						|
    UsersService,
 | 
						|
    User,
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
# "Chained Factories" pattern
 | 
						|
 | 
						|
database = providers.Factory(SqlAlchemyDatabaseService, session=session)
 | 
						|
 | 
						|
tokens = providers.Factory(
 | 
						|
    TokensService,
 | 
						|
    id_generator=id_generator,
 | 
						|
    database=providers.Factory(database, base_class=Token),
 | 
						|
)
 | 
						|
 | 
						|
users = providers.Factory(
 | 
						|
    UsersService,
 | 
						|
    id_generator=id_generator,
 | 
						|
    database=providers.Factory(database, base_class=User),
 | 
						|
)
 | 
						|
 | 
						|
tokens_service = tokens()
 | 
						|
assert tokens_service.database.base_class is Token
 | 
						|
 | 
						|
users_service = users()
 | 
						|
assert users_service.database.base_class is User
 | 
						|
 | 
						|
# Explanation & some more examples
 | 
						|
 | 
						|
# 1. Keyword arguments of upper level factory are added to lower level factory
 | 
						|
chained_dict_factory = providers.Factory(
 | 
						|
    providers.Factory(dict, arg1=1),
 | 
						|
    arg2=2,
 | 
						|
)
 | 
						|
print(chained_dict_factory())  # prints: {'arg1': 1, 'arg2': 2}
 | 
						|
 | 
						|
# 2. Keyword arguments of upper level factory have priority
 | 
						|
chained_dict_factory = providers.Factory(
 | 
						|
    providers.Factory(dict, arg1=1),
 | 
						|
    arg1=2,
 | 
						|
)
 | 
						|
print(chained_dict_factory())  # prints: {'arg1': 2}
 | 
						|
 | 
						|
# 3. Keyword arguments provided from context have most priority
 | 
						|
chained_dict_factory = providers.Factory(
 | 
						|
    providers.Factory(dict, arg1=1),
 | 
						|
    arg1=2,
 | 
						|
)
 | 
						|
print(chained_dict_factory(arg1=3))  # prints: {'arg1': 3}
 |