Disposable
CherryPick может автоматически очищать любые зависимости, реализующие интерфейс Disposable
. Это упрощает управление ресурсами (контроллеры, потоки, сокеты, файлы и др.) — особенно при закрытии скоупа или приложения.
Если вы регистрируете объект, реализующий Disposable
, как синглтон или через DI-контейнер, CherryPick вызовет его метод dispose()
при закрытии или очистке скоупа.
Основные моменты
- Поддерживаются синхронная и асинхронная очистка (dispose может возвращать
void
илиFuture
). - Все объекты
Disposable
из текущего скоупа и подскоупов будут удалены в правильном порядке. - Предотвращает утечки ресурсов и обеспечивает корректную очистку.
- Не нужно вручную связывать очистку — просто реализуйте интерфейс.
Минимальный синхронный пример
class CacheManager implements Disposable {
void dispose() {
cache.clear();
print('CacheManager удалён!');
}
}
final scope = CherryPick.openRootScope();
scope.installModules([
Module((bind) => bind<CacheManager>().toProvide(() => CacheManager()).singleton()),
]);
// ...спустя время
await CherryPick.closeRootScope(); // выведет: CacheManager удалён!
Асинхронный пример
class MyServiceWithSocket implements Disposable {
@override
Future<void> dispose() async {
await socket.close();
print('Socket закрыт!');
}
}
scope.installModules([
Module((bind) => bind<MyServiceWithSocket>().toProvide(() => MyServiceWithSocket()).singleton()),
]);
await CherryPick.closeRootScope(); // дождётся завершения async очистки
Совет: Всегда вызывайте await CherryPick.closeRootScope()
или await scope.closeSubScope(key)
в вашем shutdown/teardown-коде для гарантированной очистки ресурсов.