pythondependency-injection

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

Solution

  • 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