← ClaudeAtlas

injectable-dilisted

GM Injectable DI patterns — modular (per-package di.dart + Config class) vs non-modular (single injector.dart)
ghozimahdi/gm-aiagent-plugins · ★ 0 · AI & Automation · score 67
Install: claude install-skill ghozimahdi/gm-aiagent-plugins
Resolve `UFIL_ROOT` to the plugin root containing this skill. Claude Code may provide `CLAUDE_PLUGIN_ROOT`; Codex can resolve it from the installed skill path. ## Injectable / GetIt DI Patterns (GM Standard) ### Non-Modular — Single Injector ```dart // lib/injector.dart import 'package:get_it/get_it.dart'; import 'package:injectable/injectable.dart'; import 'injector.config.dart'; final getIt = GetIt.instance; @InjectableInit() Future<void> configureDependencies() async { getIt.registerLazySingleton<AppRouter>(() => AppRouter()); getIt.init(); } ``` All registrations go to single `injector.config.dart` (auto-generated). ### Modular — Per-Package DI + Config Class **Each package has its own `di.dart`:** ```dart // packages/domain/domain_auth/lib/src/di/di.dart import 'package:get_it/get_it.dart'; import 'package:injectable/injectable.dart'; import 'di.config.dart'; final getIt = GetIt.instance; @injectableInit void configureInjection({required String env}) { getIt.init(environment: env); } ``` **Each package has a Config class (singleton + AsyncMemoizer):** ```dart // packages/domain/domain_auth/lib/src/config/domain_auth_config.dart import 'package:library_common/library_common.dart'; class DomainAuthConfig extends AppConfig { DomainAuthConfig._(); static final DomainAuthConfig _instance = DomainAuthConfig._(); static DomainAuthConfig getInstance() { return _instance; } @override Future<bool> config({required String env}) async { configu