Módulos Isolados e Injeção de Dependência
Em sistemas de grande escala, como um ecossistema médico, o maior desafio não é escrever código, mas gerenciar o acoplamento. Nossa arquitetura resolve isso através de Módulos Isolados e um mecanismo robusto de Injeção de Dependência (Dynamic Injection).
O Conceito de Módulo Isolado (Bounded Context)
Um módulo não é apenas uma pasta; é um Contexto Delimitado (do inglês Bounded Context no DDD). Ele representa uma fatia funcional do negócio com seu próprio vocabulário, regras e estado.
- Autonomia: O módulo de
Agendamentodeve funcionar mesmo que o módulo deChatsofra uma refatoração completa. - Fronteiras Claras: Um módulo nunca "vaza" sua lógica interna para outros módulos. A comunicação é feita estritamente através de contratos de eventos ou APIs públicas.
- Independência Tecnológica: Se um módulo específico precisar de uma biblioteca diferente para processar imagens DICOM (exames), ele pode tê-la sem afetar o restante do sistema.
Injeção Dinâmica (Dynamic Redux & Saga Injection)
A Injeção Dinâmica é a forma como implementamos a Injeção de Dependência em nível de estado global. Em vez de termos uma Store gigante carregada no início da aplicação, injetamos os recursos de Redux (reducers) e Sagas (side-effects) sob demanda.
Por que injetar dinamicamente?
- Redução do Bundle Inicial: O código de um módulo complexo como o
Prontuáriosó é baixado e injetado na memória se o usuário realmente for utilizá-lo. - Isolamento de Estado: Como cada módulo injeta seu próprio reducer em uma chave específica da Store, evitamos colisões de nomes e garantimos que um módulo não consiga sobrescrever dados de outro acidentalmente.
- Ciclo de Vida Controlado: Os recursos são injetados quando o componente do módulo é montado e podem ser limpos quando ele é desmontado, otimizando o uso de memória em dispositivos de baixo desempenho.
Como funciona na prática
Utilizamos o padrão Store Manager para coordenar as injeções:
[App Root] -> Cria Store Base (Vazia de Domínios)
|
v
[Navegação para /atendimento] -> [Componente de Módulo]
| |
+---------------------------------> [Trigger: useInjectReducer/Saga]
|
[Store Manager] -> Atualiza Store -> Dispara Re-renderBenefícios para a Manutenibilidade
- Times Independentes: Times diferentes podem trabalhar em módulos diferentes sem conflitos de merge na configuração central da Store.
- Testabilidade: Podemos testar um módulo de forma isolada, injetando apenas o que é necessário para aquele contexto específico.
- Facilidade de Refatoração: Mudar a estrutura interna de um módulo não exige alterações globais no ecossistema, desde que a API pública (index.ts) seja respeitada.
Este fundamento teórico é o que permite que nossa aplicação se comporte como um Monólito Modular — a experiência de desenvolvimento de um monólito com o isolamento e escalabilidade de microserviços.