python-dependency-injector icon indicating copy to clipboard operation
python-dependency-injector copied to clipboard

recursive_wire

Open lagunovartur opened this issue 1 year ago • 1 comments
trafficstars

Приветствую, хотел поинтересоваться почему в библиотеке нет рекурсивного связывания на подобие такого, это позволяет делать инъекции не от корня, а от ближайшего родителя:

Например: Так: @router.get("/test") @inject async def get_list(s3_manager = Depends(Provide[S3Container.manager])): pass

Вместо: @router.get("/test") @inject async def get_list(s3_client = Depends(Provide[AppContainer.infra.s3.manager])): pass

Рекурсивное связывание:

def recursive_wire(container, *args, **kwargs):
   
    container.wire(*args, **kwargs)

    for attr_name in dir(container):
        if attr_name.startswith('_') or attr_name == 'parent':
            continue
        attr = getattr(container, attr_name, None)
        if isinstance(attr, providers.Container):
            sub_container = attr() 
            recursive_wire(sub_container, *args, **kwargs)

lagunovartur avatar Sep 05 '24 20:09 lagunovartur

Translation

Hello,

I would like to inquire about the absence of recursive binding in the library, similar to the following. This feature allows for dependency injection from the nearest parent, rather than from the root.

For example:

@router.get("/test")
@Inject
async def get_list(s3_manager = Depends(Provide[S3Container.manager])):
    pass

Instead of:

@router.get("/test")
@Inject
async def get_list(s3_client = Depends(Provide[AppContainer.infra.s3.manager])):
    pass

Recursive binding:

def recursive_wire(container, *args, **kwargs):
   
    container.wire(*args, **kwargs)

    for attr_name in dir(container):
        if attr_name.startswith('_') or attr_name == 'parent':
            continue
        attr = getattr(container, attr_name, None)
        if isinstance(attr, providers.Container):
            sub_container = attr() 
            recursive_wire(sub_container, *args, **kwargs)

LeOndaz avatar Oct 12 '24 04:10 LeOndaz