Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/vzsoares/inversao-de-dependencia
Implementando inversão de dependência passo a passo.
https://github.com/vzsoares/inversao-de-dependencia
dependency-inversion learn-by-doing
Last synced: about 1 month ago
JSON representation
Implementando inversão de dependência passo a passo.
- Host: GitHub
- URL: https://github.com/vzsoares/inversao-de-dependencia
- Owner: vzsoares
- Created: 2024-06-16T21:43:06.000Z (6 months ago)
- Default Branch: master
- Last Pushed: 2024-06-21T21:32:16.000Z (6 months ago)
- Last Synced: 2024-06-22T22:13:27.665Z (6 months ago)
- Topics: dependency-inversion, learn-by-doing
- Language: TypeScript
- Homepage:
- Size: 1.01 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Inversão de Dependência na Prática
Neste repositório, vamos implementar a inversão de dependência (Dependency Inversion - DI) na prática.
## [Veja o Vídeo dessa implementação!](https://youtu.be/QjUPhLq94ng)
### 🤔 Contexto:
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.
### 🚀 Implementação:
A implementação ocorrerá em 4 passos, conforme a [estrutura de arquivos]() abaixo:
```sh
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.
### 1️⃣:
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 😱
### 2️⃣:
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.
### 3️⃣:
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.
### 4️⃣:
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! ❤️
---
### 📐 Desafio:
Faça você mesmo, baixe o repositório e delete as pastas 2,3 e 4. Depois implemente a inversão de dependência.
### 🤓 Rodando localmente:
```sh
# tsx required
# yarn requiredyarn install # instala dependências
tsx ./1/main.ts # roda o arquivo desejado
```