docs+feat: add Disposable interface source and usage example

feat(core,doc): unified async dispose mechanism for resource cleanup

BREAKING CHANGE:

- Added full support for asynchronous resource cleanup via a unified FutureOr<void> dispose() method in the Disposable interface.
- The Scope now provides only Future<void> dispose() for disposing all tracked resources and child scopes (sync-only dispose() was removed).
- All calls to cleanup in code and tests (scope itself, subscopes, and custom modules) now require await ...dispose().
- Documentation and all examples updated: resource management is always async and must be awaited; Disposable implementers may use both sync and async cleanup.
- Old-style, synchronous cleanup methods have been completely removed (API is now consistently async for all DI lifecycle management).
- Example and tutorial code now demonstrate async resource disposal patterns.
This commit is contained in:
Sergey Penkovsky
2025-08-01 15:07:12 +03:00
parent 61f2268d63
commit a9c95f6a89
14 changed files with 516 additions and 69 deletions

View File

@@ -0,0 +1,40 @@
import 'package:cherrypick/cherrypick.dart';
/// Ваш сервис с освобождением ресурсов
class MyService implements Disposable {
bool wasDisposed = false;
@override
void dispose() {
// Например: закрыть соединение, остановить таймер, освободить память
wasDisposed = true;
print('MyService disposed!');
}
void doSomething() => print('Doing something...');
}
void main() {
final scope = CherryPick.openRootScope();
// Регистрируем биндинг (singleton для примера)
scope.installModules([
ModuleImpl(),
]);
// Получаем зависимость
final service = scope.resolve<MyService>();
service.doSomething(); // «Doing something...»
// Освобождаем все ресурсы
scope.dispose();
print('Service wasDisposed = ${service.wasDisposed}'); // true
}
/// Пример модуля CherryPick
class ModuleImpl extends Module {
@override
void builder(Scope scope) {
bind<MyService>().toProvide(() => MyService()).singleton();
}
}