Neste repositório, vamos implementar a inversão de dependência (Dependency Inversion - DI) na prática.
A inversão de dependência em programação é sobre desacoplar regras e abstraí-las para uma camada superior, permitindo uma gestão mais limpa e isolamento da regra.
Vamos implementar a arquitetura em camadas (Layered Architecture), separando dados, domínio e apresentação.
A implementação ocorrerá em 4 passos, conforme a estrutura de arquivos abaixo:
1/ # Aqui tudo estará acoplado
└── main.ts # temos apenas um arquivo );
2/ # Vamos começar desacoplando a camada de persistência
├── store/
│ └── dbSqlRepository.ts # Implementação baseada no Rository Pattern
├── main.ts
└── types.ts # Arquivo para especificar os tipos da aplicação
3/ # Desacoplaremos as regras de negócio
├── domain/
│ └── fooDomain.ts # Implementação das regras de foo
├── store/
│ ├── dbSqlRepository.ts
│ └── dbNoSqlRepository.ts # Exemplificando a possibilidade de alteração
├── main.ts
└── types.ts
4/ # E por fim, desacoplamos a camada de apresentação
├── domain/
│ └── fooDomain.ts
├── handlers/
│ ├── getProductApiHandler.ts # Handlers atendem necessidades específicas
│ └── getProductQueueHandler.ts
├── store/
│ ├── dbSqlRepository.ts
│ └── dbNoSqlRepository.ts
├── main.ts
└── types.ts
Em cada passo, representado pelo nome das pastas, vamos abstrair uma das camadas mencionadas.
Na primeira iteração, a aplicação está totalmente acoplada e não reutilizável. Se precisarmos da mesma funcionalidade em outro lugar, seria necessário copiar e colar o código 😱
Aqui é criado a camada de persistência, que é normalmente a primeira a ser extraída, pois permite que toda a aplicação tenha acesso uniforme às informações.
Na terceira etapa, abstraímos a camada de domínio, que contém as regras de negócio que regem a legalidade das operações.
Por fim, uniformizamos a disponibilização da aplicação para o mundo exterior através de handlers, utilizando exemplos de API e SQS, que são casos de uso comuns.
Veja o que foi feito:
Ao final, podemos escalar a aplicação horizontalmente, adicionando novos módulos em suas respectivas camadas.
Isso adiciona complexidade e requer mais configuração e planejamento. Talvez não seja necessário para algo muito pequeno, mas é bom se prevenir, não é mesmo? 👼
Agora que você conhece DI, observe em suas aplicações como poderia implementar algo similar, seguindo este princípio! ❤️
Faça você mesmo, baixe o repositório e delete as pastas 2,3 e 4. Depois implemente a inversão de dependência.
# tsx required
# yarn required
yarn install # instala dependências
tsx ./1/main.ts # roda o arquivo desejado