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
A 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
A 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
A 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
A 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.