Я использую dependency_injector для управления внедрением зависимостей. Я не понимаю, как освободить свои ресурсы с помощью этой библиотеки.
Я нашел метод shutdown_resources , но понятия не имею, как его правильно использовать.
Пример:
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
Прошло некоторое время, но я узнал. Для этих целей вместо конструктора по умолчанию следует использовать генератор инициализации:
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
УПД:
Я нашел еще более чистый и лаконичный способ сделать это! Вы можете наследовать свой ресурс от resources.Resource
, как уже упоминалось здесь, и переопределить методы init
и shutdown
. Эти методы будут вызываться при вызове init_resources
и shutdown_resources
из контейнера.
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