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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With