fix: universal benchmarks and DI registration; proper named binding; robust override support for cherrypick and get_it; improved CLI args

This commit is contained in:
Sergey Penkovsky
2025-08-07 09:15:26 +03:00
parent d523a5f261
commit 64f33b20a7
11 changed files with 233 additions and 52 deletions

View File

@@ -12,11 +12,11 @@ class CherrypickDIAdapter implements DIAdapter {
}
@override
T resolve<T>({String? named}) =>
T resolve<T extends Object>({String? named}) =>
named == null ? _scope!.resolve<T>() : _scope!.resolve<T>(named: named);
@override
Future<T> resolveAsync<T>({String? named}) async =>
Future<T> resolveAsync<T extends Object>({String? named}) async =>
named == null ? await _scope!.resolveAsync<T>() : await _scope!.resolveAsync<T>(named: named);
@override
@@ -30,6 +30,9 @@ class CherrypickDIAdapter implements DIAdapter {
final sub = _scope!.openSubScope(name);
return _CherrypickSubScopeAdapter(sub);
}
@override
Future<void> waitForAsyncReady() async {}
}
/// Internal adapter for a CherryPick sub-scope (callbacks based).
@@ -43,11 +46,11 @@ class _CherrypickSubScopeAdapter extends CherrypickDIAdapter {
}
@override
T resolve<T>({String? named}) =>
T resolve<T extends Object>({String? named}) =>
named == null ? _subScope.resolve<T>() : _subScope.resolve<T>(named: named);
@override
Future<T> resolveAsync<T>({String? named}) async =>
Future<T> resolveAsync<T extends Object>({String? named}) async =>
named == null ? await _subScope.resolveAsync<T>() : await _subScope.resolveAsync<T>(named: named);
@override

View File

@@ -8,14 +8,17 @@ abstract class DIAdapter {
void setupDependencies(void Function(dynamic container) registration);
/// Резолвит (возвращает) экземпляр типа [T] (по имени, если требуется).
T resolve<T>({String? named});
T resolve<T extends Object>({String? named});
/// Асинхронно резолвит экземпляр типа [T].
Future<T> resolveAsync<T>({String? named});
Future<T> resolveAsync<T extends Object>({String? named});
/// Уничтожает/отчищает DI-контейнер.
void teardown();
/// Открывает дочерний под-scope (если применимо).
DIAdapter openSubScope(String name);
/// Ожидание готовности DI контейнера (нужно для async DI, например get_it)
Future<void> waitForAsyncReady();
}

View File

@@ -0,0 +1,32 @@
import 'package:get_it/get_it.dart';
import 'di_adapter.dart';
class GetItAdapter implements DIAdapter {
late GetIt _getIt;
@override
void setupDependencies(void Function(dynamic container) registration) {
_getIt = GetIt.asNewInstance();
registration(_getIt);
}
@override
T resolve<T extends Object>({String? named}) => _getIt<T>(instanceName: named);
@override
Future<T> resolveAsync<T extends Object>({String? named}) async => _getIt<T>(instanceName: named);
@override
void teardown() => _getIt.reset();
@override
DIAdapter openSubScope(String name) {
// get_it не поддерживает scope, возвращаем новый инстанс
return GetItAdapter();
}
@override
Future<void> waitForAsyncReady() async {
await _getIt.allReady();
}
}