ivnagst / API-CPF-Validator

0 stars 0 forks source link

Organizar arquitetura do projeto #24

Open Farenheith opened 1 year ago

Farenheith commented 1 year ago

Para uma boa mantenabilidade, o ideal é que o projeto seja separado em camadas com responsabilidades claras, e sem invasão de escopo entre elas.

Uma arquitetura que funciona bem com typescript é a onion. Abaixo, há um artigo que explica como usá-la com inversify. https://dev.to/remojansen/implementing-the-onion-architecture-in-nodejs-with-typescript-and-inversifyjs-10ad

Veja uma imagem, extraída deste artigo, da organização dessa arquitetura: image

Alguns insights sobre cada camada:

É importante seguir essas regras ao organiar o projeto assim:

Quando uma classe de repositorio é criada, você pode fazer algo assim, por exemplo:

export abstract class CustomerRepository {
   abstract getCustomerById(id: string): Promise<Customer | undefied>;
}

Então, na infrastructure, pode implementar ela, tratando ela como se fosse interface (o typescript permite isso):

export class MongoCustomerRepository implements CustomerRepository {
  async getCustomerById(id: string) {
    // Implementação aqui
  }
}

É estranho usar classe como interface, mas isso te trás uma vantagem: na hora de declarar a injeção, você pode usar a classe abstrata como símbolo de injeção e deixar seu código mais limpo:

bind(CustomerRepository).to(MongoCustomerRepository).inSingletonScope();

E aí, na hora de injetar:

constructor(private repo: CustomerRepository) {}

Isso dispensa o uso do decorator @inject. O @injectable ainda será necessário nas classes concretas, independente da camada. Isso é uma exceção às regras citadas acima. Algumas bibliotecas externas também podem ser consideradas exceção e serem usadas em qualquer camada, caso o papel delas não tenha a ver com infra estrutura, como as libs moment ou uuid, por exemplo.

Finalmente, agora que você chegou nesse ponto onde o projeto tá todo usando injeção, pegue essas informações e organize melhor o projeto, para seguir essas regras arquiteturais!

ivnagst commented 1 year ago

Show!!!