API RESTful desenvolvida em .NET 8 para gerenciamento de cursos, alunos e matrículas.
- .NET 8 SDK
- SQL Server (LocalDB, Express ou versão completa)
- Visual Studio 2022 ou VS Code
O projeto segue os princípios de Domain-Driven Design (DDD) e Clean Architecture, organizado em 4 camadas:
StudentsRegistrationSystem/
├── src/
│ ├── StudentsRegistrationSystem.Core/ # Entidades, DTOs, Interfaces
│ ├── StudentsRegistrationSystem.Application/ # Handlers, Commands, Queries (CQRS)
│ ├── StudentsRegistrationSystem.Infrastructure/# Repositórios, DbContext, Migrations
│ └── StudentsRegistrationSystem.API/ # Controllers, Configuração
└── tests/
└── UnitTests/
├── StudentsRegistrationSystem.API.UnitTests/ # Testes dos Controllers
└── StudentsRegistrationSystem.Application.UnitTests/# Testes de Handlers
- DDD (Domain-Driven Design): Organização em camadas com foco no domínio
- CQRS: Separação de Commands (escrita) e Queries (leitura)
- Result Pattern: Gerenciamento de erros sem exceptions
- Repository Pattern: Abstração do acesso a dados
- Mediator Pattern: Desacoplamento com NetDevPack.Mediator
git clone <url-do-repositorio>
cd StudentsRegistrationSystemEdite o arquivo src/StudentsRegistrationSystem.API/appsettings.json e ajuste a connection string:
{
"ConnectionStrings": {
"DefaultConnection": "Server=<HOST>,<PORT>;Database=<DATABASE_NAME>;User Id=<USERNAME>;Password=<PASSWORD>;TrustServerCertificate=True;"
}
}Alternativas de Connection String:
- SQL Server LocalDB:
Server=(localdb)\\mssqllocaldb;Database=StudentsRegistrationSystemDb;Trusted_Connection=True; - SQL Server com usuário/senha:
Server=localhost;Database=StudentsRegistrationSystemDb;User Id=seu_usuario;Password=sua_senha;TrustServerCertificate=True; - SQL Server Express:
Server=localhost\\SQLEXPRESS;Database=StudentsRegistrationSystemDb;Trusted_Connection=True;TrustServerCertificate=True;
dotnet restore# Instalar ferramenta EF Core (se necessário)
dotnet tool install --global dotnet-ef
# Aplicar migrations
dotnet ef database update --project src/StudentsRegistrationSystem.Infrastructure --startup-project src/StudentsRegistrationSystem.APIcd src/StudentsRegistrationSystem.API
dotnet runA API estará disponível em:
- HTTPS: https://localhost:7034
- HTTP: http://localhost:5238
- Swagger: https://localhost:7034/swagger (documentação interativa)
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/cursos |
Listar todos os cursos |
| GET | /api/cursos/{id} |
Buscar curso por ID |
| POST | /api/cursos |
Criar novo curso |
| PUT | /api/cursos/{id} |
Atualizar curso |
| DELETE | /api/cursos/{id} |
Excluir curso |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/alunos |
Listar todos os alunos |
| GET | /api/alunos/matriculados |
Listar alunos matriculados |
| GET | /api/alunos/{id} |
Buscar aluno por ID |
| POST | /api/alunos |
Criar novo aluno |
| PUT | /api/alunos/{id} |
Atualizar aluno |
| DELETE | /api/alunos/{id} |
Excluir aluno |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/matriculas/curso/{cursoId}/alunos |
Listar alunos de um curso |
| POST | /api/matriculas |
Matricular aluno em curso |
| DELETE | /api/matriculas |
Remover matrícula |
POST https://localhost:7034/api/cursos
Content-Type: application/json
{
"nome": "Desenvolvimento Web com ASP.NET Core",
"descricao": "Curso completo de desenvolvimento web com .NET"
}POST https://localhost:7034/api/alunos
Content-Type: application/json
{
"nome": "João Silva",
"email": "joao.silva@email.com",
"dataNascimento": "1995-05-15"
}Observação: Apenas alunos maiores de 18 anos podem ser cadastrados.
POST https://localhost:7034/api/matriculas
Content-Type: application/json
{
"alunoId": "guid-do-aluno",
"cursoId": "guid-do-curso"
}DELETE https://localhost:7034/api/matriculas
Content-Type: application/json
{
"alunoId": "guid-do-aluno",
"cursoId": "guid-do-curso"
}- Nome: obrigatório, entre 3 e 200 caracteres
- Descrição: obrigatória, entre 10 e 1000 caracteres
- Nome: obrigatório, entre 3 e 200 caracteres
- Email: obrigatório, formato válido, único no sistema
- Data de Nascimento: obrigatória, aluno deve ter 18 anos ou mais
- Aluno e Curso devem existir
- Aluno não pode estar matriculado duas vezes no mesmo curso
O projeto conta com uma suíte completa de testes unitários organizados em duas camadas:
tests/
└── UnitTests/
├── StudentsRegistrationSystem.API.UnitTests/ # Testes de Controllers
│ └── Controllers/
│ ├── AlunosControllerTests.cs
│ ├── CursosControllerTests.cs
│ └── MatriculasControllerTests.cs
│
└── StudentsRegistrationSystem.Application.UnitTests/ # Testes de Handlers
├── Alunos/ # Testes de Commands e Queries de Alunos
├── Cursos/ # Testes de Commands e Queries de Cursos
└── Matriculas/ # Testes de Commands de Matrículas
- xUnit: Framework de testes
- Moq: Biblioteca de mocking
- AwesomeAssertions: Asserções fluentes e expressivas
- Coverlet: Análise de cobertura de código
# Executar todos os testes
dotnet test
# Executar testes de um projeto específico
dotnet test tests/UnitTests/StudentsRegistrationSystem.API.UnitTests
dotnet test tests/UnitTests/StudentsRegistrationSystem.Application.UnitTests
# Executar testes com relatório de cobertura
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
# Executar testes com saída detalhada
dotnet test --verbosity detailed
# Executar testes e exibir apenas resultados
dotnet test --logger:"console;verbosity=minimal"Os testes cobrem:
- ✅ Controllers: Validação de respostas HTTP e integração com Mediator
- ✅ Handlers: Lógica de negócio de Commands e Queries
- ✅ Validações: Regras de negócio e validação de dados
- ✅ Cenários de Sucesso: Fluxos principais da aplicação
- ✅ Cenários de Erro: Tratamento de casos excepcionais
- .NET 8: Framework principal
- ASP.NET Core: Web API
- Entity Framework Core 8: ORM
- SQL Server: Banco de dados
- NetDevPack.SimpleMediator: Implementação do padrão Mediator (CQRS)
- Swagger/OpenAPI: Documentação da API
- xUnit: Framework de testes unitários
- Moq: Biblioteca de mocking
- AwesomeAssertions: Biblioteca de asserções
StudentsRegistrationSystem/
├── src/
│ ├── StudentsRegistrationSystem.Core/
│ │ ├── Alunos/
│ │ │ └── Domains/ # DTOs e interfaces de Alunos
│ │ ├── Cursos/
│ │ │ └── Domains/ # DTOs e interfaces de Cursos
│ │ ├── Matriculas/
│ │ │ └── Domains/ # DTOs e interfaces de Matrículas
│ │ ├── BaseEntity/ # Entidade base
│ │ └── Shared/ # Result Pattern e utilitários
│ │
│ ├── StudentsRegistrationSystem.Application/
│ │ ├── Alunos/
│ │ │ ├── Commands/ # Commands CQRS para Alunos
│ │ │ └── Queries/ # Queries CQRS para Alunos
│ │ ├── Cursos/
│ │ │ ├── Commands/ # Commands CQRS para Cursos
│ │ │ └── Queries/ # Queries CQRS para Cursos
│ │ └── Matriculas/
│ │ ├── Commands/ # Commands CQRS para Matrículas
│ │ └── Queries/ # Queries CQRS para Matrículas
│ │
│ ├── StudentsRegistrationSystem.Infrastructure/
│ │ ├── Data/
│ │ │ ├── Configurations/ # IEntityTypeConfiguration
│ │ │ ├── Migrations/ # Migrations do EF Core
│ │ │ └── AppDbContext.cs
│ │ ├── Repositories/ # Implementação dos repositórios
│ │ └── Interfaces/ # Interfaces de repositórios
│ │
│ └── StudentsRegistrationSystem.API/
│ ├── Controllers/ # Endpoints REST
│ ├── Extensions/ # Extensões e configurações
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── Program.cs # Configuração da aplicação
│ └── appsettings.json # Configurações
│
└── tests/
└── UnitTests/
├── StudentsRegistrationSystem.API.UnitTests/
│ └── Controllers/ # Testes dos Controllers
│
└── StudentsRegistrationSystem.Application.UnitTests/
├── Alunos/ # Testes de Alunos
├── Cursos/ # Testes de Cursos (note: pasta chamada "Cursors")
└── Matriculas/ # Testes de Matrículas
# Criar nova migration
dotnet ef migrations add NomeDaMigration --project src/StudentsRegistrationSystem.Infrastructure --startup-project src/StudentsRegistrationSystem.API
# Aplicar migrations
dotnet ef database update --project src/StudentsRegistrationSystem.Infrastructure --startup-project src/StudentsRegistrationSystem.API
# Reverter última migration
dotnet ef migrations remove --project src/StudentsRegistrationSystem.Infrastructure --startup-project src/StudentsRegistrationSystem.API# Compilar solução
dotnet build
# Compilar em modo Release
dotnet build --configuration Release
# Executar aplicação via CLI
dotnet run --project src/StudentsRegistrationSystem.API
# Executar todos os testes
dotnet test
# Executar testes com cobertura
dotnet test /p:CollectCoverage=true
# Limpar build
dotnet cleanAs seguintes referências foram especialmente úteis durante a implementação:
- Result Pattern: How to Manage Errors in .NET with the Result Pattern - Implementação do padrão Result para tratamento de erros sem exceptions
- Paginação: Pagination in a .NET Web API with EF Core - Guia para implementação de paginação eficiente com Entity Framework Core
- As matrículas são soft deleted (campo
Ativaao invés de exclusão física) - Todos os endpoints retornam respostas padronizadas com
Result Pattern