// ignore_for_file: invalid_use_of_protected_member import 'package:benchmark_di/di_adapters/di_adapter.dart'; import 'package:benchmark_di/scenarios/universal_binding_mode.dart'; import 'package:benchmark_di/scenarios/universal_scenario.dart'; import 'package:benchmark_di/scenarios/universal_service.dart'; import 'package:benchmark_di/di_adapters/yx_scope_universal_container.dart'; /// DIAdapter для yx_scope UniversalYxScopeContainer class YxScopeAdapter extends DIAdapter { late UniversalYxScopeContainer _scope; @override void setupDependencies( void Function(UniversalYxScopeContainer container) registration) { _scope = UniversalYxScopeContainer(); registration(_scope); } @override T resolve({String? named}) { return _scope.depFor(name: named).get; } @override Future resolveAsync({String? named}) async { return resolve(named: named); } @override void teardown() { // У yx_scope нет явного dispose на ScopeContainer, но можно добавить очистку Map/Deps если потребуется // Ничего не делаем } @override YxScopeAdapter openSubScope(String name) { // Для простоты всегда возвращаем новый контейнер, сабскоупы не реализованы явно return YxScopeAdapter(); } @override Future waitForAsyncReady() async { // Все зависимости синхронны return; } @override Registration universalRegistration({ required S scenario, required int chainCount, required int nestingDepth, required UniversalBindingMode bindingMode, }) { if (scenario is UniversalScenario) { return (scope) { switch (scenario) { case UniversalScenario.asyncChain: for (int chain = 1; chain <= chainCount; chain++) { for (int level = 1; level <= nestingDepth; level++) { final prevDepName = '${chain}_${level - 1}'; final depName = '${chain}_$level'; final dep = scope.dep( () => UniversalServiceImpl( value: depName, dependency: level > 1 ? scope.depFor(name: prevDepName).get : null, ), name: depName, ); scope.register(dep, name: depName); } } break; case UniversalScenario.register: final dep = scope.dep( () => UniversalServiceImpl(value: 'reg', dependency: null), ); scope.register(dep); break; case UniversalScenario.named: final dep1 = scope.dep( () => UniversalServiceImpl(value: 'impl1'), name: 'impl1', ); final dep2 = scope.dep( () => UniversalServiceImpl(value: 'impl2'), name: 'impl2', ); scope.register(dep1, name: 'impl1'); scope.register(dep2, name: 'impl2'); break; case UniversalScenario.chain: for (int chain = 1; chain <= chainCount; chain++) { for (int level = 1; level <= nestingDepth; level++) { final prevDepName = '${chain}_${level - 1}'; final depName = '${chain}_$level'; final dep = scope.dep( () => UniversalServiceImpl( value: depName, dependency: level > 1 ? scope.depFor(name: prevDepName).get : null, ), name: depName, ); scope.register(dep, name: depName); } } break; case UniversalScenario.override: // handled at benchmark level break; } if (scenario == UniversalScenario.chain || scenario == UniversalScenario.override) { final depName = '${chainCount}_$nestingDepth'; final lastDep = scope.dep( () => scope.depFor(name: depName).get, ); scope.register(lastDep); } }; } throw UnsupportedError( 'Scenario $scenario not supported by YxScopeAdapter'); } }