import 'package:cherrypick/cherrypick.dart'; abstract class DIAdapter { void setupModules(List modules); T resolve({String? named}); Future resolveAsync({String? named}); void teardown(); DIAdapter openSubScope(String name); } class CherrypickDIAdapter implements DIAdapter { Scope? _scope; @override void setupModules(List modules) { _scope = CherryPick.openRootScope(); _scope!.installModules(modules); } @override T resolve({String? named}) { return named == null ? _scope!.resolve() : _scope!.resolve(named: named); } @override Future resolveAsync({String? named}) async { return named == null ? await _scope!.resolveAsync() : await _scope!.resolveAsync(named: named); } @override void teardown() { CherryPick.closeRootScope(); _scope = null; } @override CherrypickDIAdapter openSubScope(String name) { final sub = _scope!.openSubScope(name); return _CherrypickSubScopeAdapter(sub); } } class _CherrypickSubScopeAdapter extends CherrypickDIAdapter { final Scope _subScope; _CherrypickSubScopeAdapter(this._subScope); @override void setupModules(List modules) { _subScope.installModules(modules); } @override T resolve({String? named}) { return named == null ? _subScope.resolve() : _subScope.resolve(named: named); } @override Future resolveAsync({String? named}) async { return named == null ? await _subScope.resolveAsync() : await _subScope.resolveAsync(named: named); } @override void teardown() { // subScope teardown убирать отдельно не требуется } @override CherrypickDIAdapter openSubScope(String name) { return _CherrypickSubScopeAdapter(_subScope.openSubScope(name)); } }