Como estruturo pastas utilizando o Clean Architecture
- #.NET
- #.NET C#
Clean Architecture é uma abordagem popular para estruturar seu aplicativo. É uma arquitetura que se divide em quatro camadas proposta por Uncle Bob no seu livro Clean Architecture. Refere-se à organização do projeto de forma que seja fácil de entender e fácil de mudar conforme o projeto cresce.
- Domain
- Application
- Infrastructure
- Presentation
Cada uma das camadas é normalmente um projeto do tipo .csproj em sua solution.
Vamos iniciar com uma figura que representa a Clean Architecture:
Presentation:
ProjectReference Include="..\Application\Application.csproj" ProjectReference Include="..\Infrastructure\Infrastructure.csproj"
Application:
<ProjectReference Include="..\Domain\Domain.csproj" />
Domain:
Domain não depende de nenhuma camada! é isolada.
Infrastructure:
<ProjectReference Include="..\Application\Application.csproj" />
Domain Layer
A camada Domínio fica no centro da Arquitetura Limpa. É o coração de seu aplicativo e responsável por seus modelos principais. Aqui definimos coisas como: entities, value objects, aggregates, domain events, exceptions, repository interfaces, etc.
Aqui está a estrutura de pastas que eu utilizo:
📁 Domain
|__ 📁 Events
|__ 📁 Entities
|__ 📁 Exceptions
|__ 📁 Repositories
|__ 📁 Shared
|__ 📁 ValueObjects
Application Layer
A camada Application fica logo acima da camada Domain. Ele atua como um orquestrador para a camada de Domain, contendo os casos de uso mais importantes em sua aplicação.
Você pode estruturar seus casos de uso usando services ou commands e queries. Seguindo o padrão CQRS, então faço uso dessa abordagem.
📁 Application
|__ 📁 Abstractions
|__ 📁 Data
|__ 📁 Email
|__ 📁 Messaging
|__ 📁 Behaviors
|__ 📁 Contracts
|__ 📁 Features
|__ 📁 Commands
|__ 📁 Events
|__ 📁 Queries
Na pasta Abstractions, defino as interfaces necessárias para a camada Application. As implementações para essas interfaces estão em uma das camadas superiores. Para cada entidade na camada Domínio, crio uma pasta com os comandos, consultas e definições de eventos.
Infrastructure Layer
A camada de infraestrutura contém implementações para serviços externos. O que se enquadraria nesta categoria?
- Databases - SqlServer, PostgreSQL, MongoDB
- Identity providers - Auth0, Keycloak
- Emails providers
- Storage services - AWS, Azure Blob Storage
- Message queues - Rabbit
📁 Infrastructure
|__ 📁 Services
|__ 📁 Email
|__ 📁 Messaging
|__ 📁 Persistence
|__ 📁 EntityConfigurations
|__ 📁 Migrations
|__ 📁 Repositories
|__ #️⃣ DataContext.cs
Presentation Layer
A camada de Apresentação é o ponto de entrada para o nosso sistema. Normalmente, você implementaria isso como um projeto de Web API.
A parte mais importante da camada de Apresentação são os Controladores, que definem os endpoints da API em nosso sistema.
📁 Presentation
|__ 📁 Controllers
|__ 📁 Middlewares
|__ 📁 ViewModels
|__ #️⃣ Program.cs
Terminou por aqui?
Você não precisa seguir a estrutura de pastas que propus.
Clean Architecture é um pouco flexível, obviamente a regras estabelecidas onde você pode experimentá-la e estruturá-la da maneira que quiser.
Fontes:
Arquitetura limpa: O guia do artesão para estrutura e design de software
Clean Arhitecture, Macoratti