Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to shutdown resources using dependency_injector

I'm using dependency_injector to manage DI. I don't understand how to release my resources using this library.

I found shutdown_resources method but have no idea how to use it properly.

Example:

class Resource:
    """Resource example."""

    def __init__(self):
        """."""

        # Initialize session

    def close(self):
        """Release resources."""

        # Close session

class ApplicationContainer(DeclarativeContainer):
    """Application container."""

    resource: Singleton[Resource] = Singleton[Resource](Resource)


container = ApplicationContainer()
# Do something
container.shutdown_resources() # Call close method here
like image 653
Victor Egiazarian Avatar asked Feb 07 '26 21:02

Victor Egiazarian


1 Answers

It took some time but I found out. An initialization generator should be used for these purposes instead of a default constructor:

from dependency_injector import containers, providers


class Resource:
    """Resource example."""

    def __init__(self):
        """."""

        # Initialize session

    def close(self):
        """Release resources."""

        # Close session

def init_resource() -> None:
    resource = Resource()
    yield resource

    resource.close()



class ApplicationContainer(containers.DeclarativeContainer):
    """Application container."""

    resource = providers.Resource(init_resource)


container = ApplicationContainer()
# Do something
container.shutdown_resources() # Will call resource.close() here

UPD: I found even more clean and concise way to do it! You can inherit your resource from resources.Resource as mentioned here and override methods init and shutdown. This methods will be called on calling init_resources and shutdown_resources from container.

from dependency_injector import resources, containers


class Resource(resources.Resource):
    """Resource example."""

    def init(self) -> Session:
        return create_session(...)

    def shutdown(self, session: Session) -> None:
        session.close()


class ApplicationContainer(containers.DeclarativeContainer):
    """Application container."""

    resource: resources.Resource[Resource] = resources.Resource[Resource](Resource)


if __name__ == "__main__":
    container = ApplicationContainer()

    container.init_resources()  # init will be called here
    container.shutdown_resources()  # shutdown will be called here
like image 67
Victor Egiazarian Avatar answered Feb 09 '26 12:02

Victor Egiazarian



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!