| name | dotnet-architecture |
| description | Padroes arquiteturais e estrutura de projeto .NET C# / ASP.NET Core: Clean Architecture com camadas numeradas, Repository Pattern com Entity Framework Core, CQRS nativo (sem MediatR) com Commands, Queries, Handlers e Dispatcher, tratamento global de erros (IExceptionHandler, ProblemDetails), Custom Exceptions e Result Pattern, FluentValidation em handlers, estrutura de pastas e dependencias entre projetos. Usar quando: criar novo microservico; criar modulo/feature; implementar endpoints e fluxo CQRS; definir contratos (DTOs/requests/responses); definir ou revisar estrutura de camadas; organizar pastas e projetos; configurar referencias entre projetos. |
Padroes Arquiteturais e Estrutura de Projeto .NET C# e ASP.NET Core
Indice
- Estrutura de Pastas
- Dependencias entre Projetos
- Padroes de Arquitetura
- Comandos para Criacao da Estrutura
- Checklists
- Regras Criticas de Implementacao
Exemplos de codigo completos ficam em examples/ e devem ser abertos sob demanda conforme a tarefa:
examples/clean-architecture.md โ entidade de dominio + handler de caso de uso
examples/repository-pattern.md โ IRepository<T>, base generica e repositorio especifico
examples/cqrs.md โ interfaces CQRS, dispatcher, commands/queries, DI e controllers
examples/error-handling.md โ global exception handler, custom exceptions, Result pattern, middleware, FluentValidation
examples/project-setup.md โ comandos dotnet para criar solution, projetos e referencias
PARTE 1 โ ESTRUTURA DE PROJETO
Estrutura de Pastas
Visao Geral
Estrutura padrao para projetos .NET seguindo Clean Architecture, com camadas numeradas para facilitar navegacao e representar a hierarquia de dependencias.
ProjectName/
โโโ ProjectName.sln
โโโ 1-Services/
โ โโโ ProjectName.API/
โ โโโ ProjectName.API.csproj
โโโ 2-Application/
โ โโโ ProjectName.Application/
โ โโโ ProjectName.Application.csproj
โโโ 3-Domain/
โ โโโ ProjectName.Domain/
โ โโโ ProjectName.Domain.csproj
โ โโโ Entities/
โ โโโ Services/
โ โโโ Interfaces/
โโโ 4-Infra/
โ โโโ ProjectName.Infra/
โ โโโ ProjectName.Infra.csproj
โ โโโ Repositories/
โโโ 5-Tests/
โโโ ProjectName.UnitTests/
โ โโโ ProjectName.UnitTests.csproj
โโโ ProjectName.IntegrationTests/
โ โโโ ProjectName.IntegrationTests.csproj
โโโ ProjectName.End2EndTests/
โโโ ProjectName.End2EndTests.csproj
Descricao das Camadas
1. Services (Camada de Apresentacao)
- Pasta:
1-Services/
- Tipo: ASP.NET Core Web API
- Responsabilidade:
- Expor endpoints HTTP
- Gerenciar controllers
- Configuracao de middleware
- Autenticacao e autorizacao
- Documentacao da API (Swagger)
2. Application (Camada de Aplicacao)
- Pasta:
2-Application/
- Tipo: Class Library
- Responsabilidade:
- Casos de uso (Use Cases)
- Servicos de aplicacao
- DTOs (Data Transfer Objects)
- Mapeamentos
- Validacoes de entrada
- Orquestracao da logica de negocio
3. Domain (Camada de Dominio)
- Pasta:
3-Domain/
- Tipo: Class Library
- Responsabilidade:
- Entidades de dominio
- Regras de negocio
- Interfaces de repositorios
- Servicos de dominio
- Value Objects
- Eventos de dominio
- Subpastas:
Entities/ โ Classes de entidades do dominio
Services/ โ Servicos que encapsulam logicas de dominio
Interfaces/ โ Contratos e interfaces do dominio
4. Infra (Camada de Infraestrutura)
- Pasta:
4-Infra/
- Tipo: Class Library
- Responsabilidade:
- Implementacao de repositorios
- Acesso a dados (Entity Framework)
- Configuracoes de banco de dados
- Integracoes externas
- Servicos de infraestrutura
- Subpastas:
Repositories/ โ Implementacoes concretas dos repositorios
5. Tests (Camada de Testes)
- Pasta:
5-Tests/
- Tipo: xUnit Test Projects
- Projetos:
UnitTests โ Testes unitarios isolados, mocks e stubs
IntegrationTests โ Testes de integracao com banco de dados e servicos
End2EndTests โ Testes de ponta a ponta simulando usuario real
Dependencias entre Projetos
Fluxo de Dependencias
โโโโโโโโโโโโโโโโโโโ
โ 1-Services โ
โ (API) โ
โโโโโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ 2-Application โ
โโโโโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โ 3-Domain โโโโโโ 4-Infra โ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ
โฒ โฒ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโ
โ 5-Tests โ
โโโโโโโโโโโโโโโโโโโ
Referencias de Projeto
- API โ Application
- Application โ Domain
- Infra โ Domain
- UnitTests โ Application + Domain
- IntegrationTests โ Application + Infra
- End2EndTests โ API
Principios Arquiteturais
- Inversao de Dependencia: As camadas externas dependem das internas. O Domain nao possui dependencias externas. Interfaces no Domain sao implementadas na Infra.
- Separacao de Responsabilidades: Cada camada tem uma responsabilidade bem definida. Baixo acoplamento entre as camadas. Alta coesao dentro de cada camada.
- Testabilidade: Estrutura permite testes isolados. Dependencias podem ser mockadas. Testes cobrem todas as camadas.
Convencoes de Nomenclatura (Camadas)
- API:
ProjectName.API
- Application:
ProjectName.Application
- Domain:
ProjectName.Domain
- Infra:
ProjectName.Infra
- UnitTests:
ProjectName.UnitTests
- IntegrationTests:
ProjectName.IntegrationTests
- End2EndTests:
ProjectName.End2EndTests
PARTE 2 โ PADROES ARQUITETURAIS
Padroes de Arquitetura
Por que seguir padroes arquiteturais?
- Reduz complexidade: Separacao de responsabilidades torna sistema mais compreensivel
- Facilita testes: Camadas bem definidas permitem mocking e isolamento efetivos
- Acelera onboarding: Desenvolvedores familiarizados com padroes se adaptam mais rapido
- Reduz acoplamento: Mudancas em uma camada nao afetam outras
- Facilita evolucao: Arquitetura limpa permite crescimento sustentavel do sistema
- Melhora manutenibilidade: Bugs e mudancas ficam localizados
Clean Architecture
Regras de negocio vivem no Domain (entidades com comportamento e invariantes encapsuladas). A Application orquestra casos de uso via handlers, dependendo de abstracoes do Domain โ nunca o contrario.
โ Template completo em examples/clean-architecture.md.
Repository Pattern
Abstrai o acesso a dados atras de IRepository<T> generico, com implementacao base sobre Entity Framework Core e repositorios especificos para queries de dominio. Use AsNoTracking em consultas somente leitura.
โ Template completo em examples/repository-pattern.md.
CQRS Nativo (Sem MediatR)
Separa comandos (escrita) de queries (leitura) com interfaces proprias (ICommand<T>, IQuery<T>, ICommandHandler<,>, IQueryHandler<,>) e um Dispatcher nativo que resolve handlers via DI por reflection โ sem dependencia do MediatR. Handlers sao registrados automaticamente com Scrutor (Scan).
โ Interfaces, dispatcher, commands/queries, registro no DI e uso em controllers em examples/cqrs.md.
Tratamento de Erros
Centraliza falhas via IExceptionHandler global (ASP.NET Core 8+) traduzindo excecoes em ProblemDetails. Custom exceptions herdam de DomainException; o Result<T> pattern modela sucesso/falha sem excecoes em operacoes criticas. Validacao com FluentValidation nos handlers.
โ Global handler, custom exceptions, Result pattern, middleware de logging e FluentValidation em examples/error-handling.md.
Comandos para Criacao da Estrutura
Sequencia de comandos dotnet CLI para criar a solution, os 7 projetos das camadas e configurar as referencias entre eles.
โ Comandos completos em examples/project-setup.md.
Checklists
Clean Architecture
Repository Pattern
CQRS Nativo
Tratamento de Erros
Validacao
Estrutura de Projeto
Regras Criticas de Implementacao
-
Namespaces Limpos: Jamais inclua os prefixos numรฉricos das pastas (ex: 1-, 2-) nos namespaces.
- Correto:
namespace ProjectName.Application.UseCases
- Incorreto:
namespace ProjectName._2_Application.UseCases
-
Bibliotecas Obrigatรณrias:
- Para DI Scan: Instalar
Scrutor (dotnet add package Scrutor).
- Para Validaรงรฃo: Instalar
FluentValidation.DependencyInjectionExtensions.
- Para EF Core: Instalar
Microsoft.EntityFrameworkCore.Design.
-
Padrรฃo UnitOfWork:
- A interface
IUnitOfWork deve expor apenas Task<int> SaveChangesAsync(CancellationToken ct).
- A implementaรงรฃo deve injetar o
AppDbContext.