Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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.

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.


main

## [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:

steps

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 required

yarn install # instala dependências
tsx ./1/main.ts # roda o arquivo desejado
```