Pular para conteúdo

🧩 Injeção de Dependências

O Modugo possui um sistema de DI baseado no GetIt, permitindo registrar e acessar instâncias de serviços de forma centralizada dentro de módulos. Isso facilita a modularização, testes e reutilização de código.


🔹 Registrando Dependências

Dentro de cada módulo, você pode registrar binds usando o método binds():

final class HomeModule extends Module {
  @override
  List<Module> imports() => [CoreModule()]; // importa outros módulos se necessário

  @override
  List<IModule> routes() => [
    ChildRoute(path: '/', child: (context, state) => const HomePage()),
  ];

  @override
  void binds() {
    i
      ..registerSingleton<ServiceRepository>(ServiceRepository.instance) // singleton
      ..registerLazySingleton<OtherServiceRepository>(OtherServiceRepositoryImpl.new); // lazy singleton
  }
}

✅ Tipos de registro suportados:

  • registerSingleton<T>(instance) → Instância única já criada, retornada sempre que requisitada.
  • registerLazySingleton<T>(factory) → Instância criada apenas na primeira vez que for requisitada.
  • registerFactory<T>(factory) → Cria uma nova instância a cada requisição.

🔹 Observação: i é o Injector do Modugo, equivalente ao GetIt.I no GetIt.


🔹 Acessando Dependências

Para obter uma instância registrada dentro do módulo ou de qualquer widget que faça parte do módulo:

final service = i.get<ServiceRepository>();
final service = Modugo.get<ServiceRepository>();
final otherService = context.reade<OtherServiceRepository>();

🔹 Funciona de forma global dentro do escopo do módulo, garantindo consistência e fácil substituição para testes.


🔹 Comparação com GetIt

Se você já conhece o GetIt, o fluxo é muito parecido:

// GetIt
final getIt = GetIt.instance;
getIt.registerSingleton<ServiceRepository>(ServiceRepository.instance);

// Modugo
i.registerSingleton<ServiceRepository>(ServiceRepository.instance);

Diferenças principais:

  • Suporte direto a rotas modulares, resolvendo binds automaticamente ao acessar uma rota.

🔹 Ciclo de Vida e Modularidade

  • Lazy Singleton e Factory são criados sob demanda, economizando memória.
  • Singleton pode ser compartilhado entre módulos importados.
  • Cada módulo pode importar outros módulos, mantendo a hierarquia de dependências limpa e previsível.

🔹 Exemplo Visual de DI

[HomeModule] ---> Singleton(ServiceRepository)
              \-> LazySingleton(OtherServiceRepository)

[ProfileModule] ---> importa HomeModule
                     Singleton(ServiceRepository) já compartilhado
                     LazySingleton(ProfileService)

Visualiza como singleton é compartilhado e lazy/factory são criados sob demanda.