Como estruturar as pastas num projeto com arquitetura limpa

banner-como-estruturar-as-pastas-num-projeto-com-arquitetura-limpa

A Arquitetura Limpa é uma abordagem popular para estruturar seu aplicativo.

É uma arquitetura em camadas que divide o projeto em quatro camadas:

Cada uma das camadas é normalmente um projeto em sua solução.

Aqui está uma representação visual da Arquitetura Limpa:

Como criamos isso em nossas soluções .NET?

Camada de domínio

camada Domain fica no centro da Arquitetura Limpa. Aqui definimos coisas como: entidades, objetos de valor, agregações, eventos de domínio, exceções, interfaces de repositório, etc.

Aqui está a estrutura de pastas que eu gosto de usar:

📁 Domain
|__ 📁 DomainEvents
|__ 📁 Entities
|__ 📁 Exceptions
|__ 📁 Repositories
|__ 📁 Shared
|__ 📁 ValueObjects

Você pode introduzir mais coisas aqui se achar necessário.

Uma coisa a observar é que a camada Domain não tem permissão para fazer referência a outros projetos em sua solução.

Camada de aplicação

camada Application fica logo acima da camada Domain. Ele atua como um orquestrador para a camada Domínio, contendo os casos de uso mais importantes em seu aplicativo.

Você pode estruturar seus casos de uso usando serviços ou usando comandos e consultas.

Eu sou um grande fã do padrão CQRS, então gosto de usar a abordagem de comando e consulta.

Aqui está a estrutura de pastas que eu gosto de usar:

📁 Application
|__ 📁 Abstractions
    |__ 📁 Data
    |__ 📁 Email
    |__ 📁 Messaging
|__ 📁 Behaviors
|__ 📁 Contracts
|__ 📁 Entity1
    |__ 📁 Commands
    |__ 📁 Events
    |__ 📁 Queries
|__ 📁 Entity2
    |__ 📁 Commands
    |__ 📁 Events
    |__ 📁 Queries

Na pasta, defino as interfaces necessárias para a camada Application. As implementações para essas interfaces estão em uma das camadas superiores.Abstractions

Para cada entidade na camada Domínio, crio uma pasta com os comandos, consultas e definições de eventos.

Camada de infraestrutura

camada Infraestrutura contém implementações para serviços externos.

O que se enquadraria nessa categoria?

  • Bancos de Dados - PostgreSQL, MongoDB
  • Provedores de identidade - Auth0, Keycloak
  • Provedores de e-mail
  • Serviços de armazenamento - AWS S3, Azure Blob Storage
  • Filas de mensagens - Rabbit MQ

Aqui está a estrutura de pastas que eu gosto de usar:

📁 Infrastructure
|__ 📁 BackgroundJobs
|__ 📁 Services
    |__ 📁 Email
    |__ 📁 Messaging
|__ 📁 Persistence
    |__ 📁 EntityConfigurations
    |__ 📁 Migrations
    |__ 📁 Repositories
    |__ #️⃣ ApplicationDbContext.cs
|__ 📁 ...

Coloco minha implementação aqui se estiver usando o EF Core.DbContext

Não é incomum fazer da pasta Persistência seu projeto. Eu frequentemente faço isso para ter todo o código voltado para o banco de dados dentro de um projeto.

Camada de apresentação

camada de apresentação é o ponto de entrada para o nosso sistema. Normalmente, você implementaria isso como um projeto de API da Web.

A parte mais importante da camada de apresentação é o , que define os pontos de extremidade da API em nosso sistema.Controllers

Aqui está a estrutura de pastas que eu gosto de usar:

📁 Presentation
|__ 📁 Controllers
|__ 📁 Middlewares
|__ 📁 ViewModels
|__ 📁 ...
|__ #️⃣ Program.cs

Às vezes, vou mover a camada de apresentação para longe do projeto de API da Web real. Faço isso para isolar e impor restrições mais rígidas. Você não precisa fazer isso se for muito complicado para você.Controllers

Esse é o único caminho?

Você não precisa seguir a estrutura de pastas que propus ao T. Clean Architecture é muito flexível, e você pode experimentá-la e estruturá-la da maneira que quiser.

Gosta de mais granularidade? Crie projetos mais específicos.

Você não gosta de muitos projetos? Separe as preocupações usando pastas.

Estou aqui para lhe dar opções para explorar. Mas cabe a você decidir o que é melhor.