Projeto didatico em ASP.NET Core organizado em tres camadas principais:
Core: onde ficam as entidades, DTOs, contratos de repositorio e contratos de servico.Infrastructure: onde ficam Entity Framework,DbContext, mapeamentos e repositorios concretos.FiapStoreApi: onde ficamProgram.cs, controllers e services expostos pela API.
Uma boa ordem de leitura para entender o sistema e:
FiapStoreApi/Program.csCore/EntityCore/InputeCore/DTOCore/RepositoryeCore/ServiceInfrastructure/RepositoryFiapStoreApi/ServicesFiapStoreApi/Controllers
O Core representa o centro da regra de negocio. Ele nao deveria depender de HTTP, banco ou detalhes do ASP.NET.
Entity: modela o dominio real do sistema.InputeDTO: definem o formato de entrada e saida da API.Repository: declara contratos de persistencia.Service: declara contratos das regras de negocio.
Essa camada implementa a persistencia.
Repository/EntityFramework: concentraApplicationDbContext,EFRepository<T>e os repositorios que escrevem/leem via EF Core.Repository/Dapper: concentraDapperContexte os repositorios de leitura com SQL manual.Repository/Configurations: dizem ao EF Core como cada entidade vira tabela/coluna/relacao.Migrations: guarda o historico de evolucao do banco gerado pelo EF Core.
Essa camada recebe requests HTTP e devolve responses HTTP.
Program.cs: configura DI, Swagger, autenticacao JWT, autorizacao, banco e middlewares.Controllers: expoem as rotas.Services: concentram regras de negocio, validacoes e mapeamentos.
Quando uma chamada chega na API, o fluxo geral e:
- O request entra no pipeline configurado em
Program.cs. - Middlewares de log, autenticacao e autorizacao sao executados.
- O controller correspondente recebe a chamada.
- O controller usa um service ou repositorio.
- O repositorio usa o
ApplicationDbContextou oDapperContext, dependendo do tipo de acesso a dados. - O resultado volta como DTO para o controller.
- O controller devolve a resposta HTTP final.
-
Entitynao e a mesma coisa queDTO.Entityrepresenta como o sistema pensa os dados.DTOrepresenta como a API troca dados com o mundo externo. -
Repositorynao e a mesma coisa queService.Repositorycuida de persistencia.Servicecuida de regra de negocio. -
Controllernao deveria concentrar regra complexa. O ideal e ele apenas orquestrar HTTP. -
JWT resolve autenticacao e autorizacao. O login gera um token com claims, e depois os atributos
[Authorize]usam essas claims para permitir ou negar acesso. -
Configurationdo EF evita poluir a entidade com detalhes de banco.
-
Os controllers agora seguem um padrao mais consistente: eles falam com a camada de
service, enquanto os detalhes de leitura e escrita ficam escondidos atras da regra de negocio. -
Agora o projeto tambem mostra um modelo hibrido de acesso a dados: EF Core continua sendo usado para escrita e migrations. Dapper passa a ser usado em leituras selecionadas, onde o SQL manual ajuda a estudar consultas e mapeamento.
-
A estrutura foi organizada para deixar mais clara a separacao entre
DTO,Input,ServiceeRepository. -
Os arquivos de migration em
Infrastructure/Migrationssao gerados pelo EF Core. Eles sao importantes para versionar o banco, mas nao costumam ser o melhor ponto de entrada para entender a regra de negocio.
O projeto agora possui um projeto separado de testes chamado FiapStoreApi.Tests.
- A ideia dos testes de unidade e validar a regra de negocio sem depender de banco, Swagger ou API rodando.
- Por isso, os testes focam principalmente na camada de
Services, que e onde estao as decisoes mais importantes do sistema. - Em vez de usar um framework de mock, os testes usam dublês simples em
FiapStoreApi.Tests/TestDoubles. Isso deixa mais facil enxergar como cada dependencia foi simulada.
AuthServiceTests: validam login, geracao de token JWT, hash de senha e bloqueio de email duplicado.ClienteServiceTests: validam mapeamento de input para entidade/DTO e a regra de pedidos dos ultimos 6 meses.LivroServiceTests: mostram o padrao hibrido do projeto, com leitura via Dapper e escrita via EF Core.PedidoServiceTests: validam a criacao de pedido, incluindo os cenarios de cliente/livro inexistentes.
Use o comando abaixo na raiz da solucao:
dotnet test FiapStoreApi.slnSe voce quiser estudar a estrutura de um teste, uma boa ordem de leitura e:
FiapStoreApi.Tests/TestDoubles/RepositoryFakes.csFiapStoreApi.Tests/Services/AuthServiceTests.csFiapStoreApi.Tests/Services/ClienteServiceTests.csFiapStoreApi.Tests/Services/LivroServiceTests.csFiapStoreApi.Tests/Services/PedidoServiceTests.cs