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
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