Este repositório apresenta um projeto de API RESTful focada na gestão de dados de clientes (Conta), desenvolvido em ASP.NET Core e seguindo as melhores práticas de engenharia de software para garantir escalabilidade, manutenibilidade e alta performance.
O projeto KRT.Cliente.API demonstra uma arquitetura robusta e resiliente através da aplicação rigorosa de boas práticas:
Adotei a filosofia Clean Code para garantir que o código seja legível, conciso e autoexplicativo, minimizando a dívida técnica a longo prazo.
- Responsabilidade Única (SRP): Classes e métodos possuem responsabilidades bem definidas. Por exemplo, a camada de Controller foca apenas em roteamento e mapeamento de requisições, delegando a lógica de negócio e persistência.
- Nomeclatura Clara: Variáveis, métodos e classes são nomeados de forma explícita, eliminando a necessidade de comentários excessivos.
- Tratamento de Erros: Exceções são tratadas de forma controlada, com mensagens claras e status codes HTTP apropriados (
404 Not Found,400 Bad Request,204 No Content).
A robustez da API é assegurada por uma bateria de testes unitários e de integração, seguindo o ciclo TDD:
- Mocks e Isolamento: Utilizamos o Moq para isolar o código de produção, garantindo que os testes de Controller e serviços se concentrem apenas na lógica a ser validada, sem dependência externa (como o serviço de cache ou o banco de dados real).
- Testes de Integração com EF Core InMemory: Para validação da camada de persistência, utilizamos o provedor EF Core InMemory, simulando as interações com o banco de dados de forma rápida e controlada, crucial para verificar a concorrência e o ciclo de vida das entidades.
- Correção de Problemas de Rastreamento (EF Core): O teste
PutContafoi corrigido para explicitamente desanexar entidades do contexto (EntityState.Detached) antes de anexar uma nova versão, resolvendo problemas de rastreamento de concorrência comum em testes deUpdatecom EF Core.
Para reduzir a latência e a pressão sobre o banco de dados principal, foi implementada uma estratégia de caching avançada, seguindo o padrão Cache-Aside:
- Abstração com
IDistributedCache: O projeto utiliza a interfaceIDistributedCachedo ASP.NET Core, permitindo a fácil substituição do provedor de cache (ex: de Redis para Memcached) sem alterar a lógica da aplicação. - Estratégia de Cache Inteligente: A API prioriza a leitura do cache e garante a invalidação consistente dos dados em operações de escrita (
POST,PUT,DELETE), mantendo a precisão e a performance do sistema.
A ContasController utiliza o Redis para otimizar endpoints de leitura custosos, garantindo alta performance através de uma gestão rigorosa de consistência e latência.
Estes endpoints buscam a informação no Redis. Se não existir (cache miss), a consulta é feita no banco, e o resultado é salvo no cache com um TTL (Tempo de Vida) antes de ser retornado.
| Método (HTTP GET) | Chave do Cache no Redis | Propósito da Otimização |
|---|---|---|
GetContasAtivas() |
"ContasAtivas" |
Otimiza a busca de lista de todas as contas ativas. |
GetContasInativas() |
"ContasInativas" |
Otimiza a busca de lista de todas as contas inativas. |
GetResumoStatus() |
"ResumoStatus" |
Otimiza o cálculo de totais de contas ativas e inativas (agregação). |
GetContaPorCPF(cpf) |
conta:{cpf} |
Otimiza a busca individual de uma conta por CPF. |
GetTotaisPorAno(anos) |
TotaisPorAno:A,B... |
Otimiza consultas de agregação complexa (GroupBy, Count). |
A consistência dos dados é garantida pela função auxiliar InvalidateCaches(), que é chamada após qualquer modificação no banco de dados. Esta invalidação remove chaves específicas ("ResumoStatus", "ContasAtivas", "ContasInativas" e conta:{cpf}) para forçar a atualização do cache na próxima leitura.
| Métodos de Escrita que Invalidam o Cache | Ação no Banco de Dados |
|---|---|
PostConta(), PutConta(), DeleteConta() |
Criação, Atualização e Deleção de conta. |
AtivarConta(), InativarConta() |
Modificação do status de uma conta. |
SoftDelete(), RestaurarConta() |
Modificação do status de deleção lógica. |
O projeto utiliza o SQLite como motor de banco de dados para o desenvolvimento local e testes de integração, aproveitando suas características singulares:
- Zero Configuração (Serverless): O SQLite dispensa um servidor de banco de dados dedicado. O banco de dados é armazenado em um único arquivo, o que elimina a complexidade de instalação, configuração e manutenção de instâncias de bancos de dados como SQL Server ou PostgreSQL.
- Portabilidade Imediata: A facilidade de movimentação do arquivo do banco de dados torna o ambiente de desenvolvimento extremamente portátil e rápido de configurar em qualquer nova máquina.
- Agilidade em CI/CD e Testes: Em pipelines de Integração Contínua/Entrega Contínua (CI/CD), a ausência de dependências de servidor para o banco de dados simplifica o ambiente de build e acelera a execução de testes de integração, contribuindo para ciclos de feedback mais rápidos.
- Linguagem: C#
- Framework: ASP.NET Core
- Persistência: Entity Framework Core (EF Core) com SQLite e EF Core InMemory (para testes unitários)
- Testes: xUnit, Moq
- Cache:
IDistributedCache(Pronto para Redis)
-
Clone o repositório:
git clone https://github.com/danhpaiva/krt-client-api-mvc-net-sqlite-xunit.git cd KRT.Cliente.API -
Restaure as dependências:
dotnet restore
-
Execute a API:
dotnet run --project KRT.Cliente.Api
A API estará acessível em
https://localhost:7249/swagger/index.html.
Para validar a integridade e a qualidade do código, execute o conjunto completo de testes a partir da linha de comando:
dotnet test KRT.Cliente.API.TestEste projeto foi desenvolvido por:
- Nome: Daniel Paiva
- LinkedIn: https://www.linkedin.com/in/danhpaiva/
Sinta-se à vontade para conectar-se e discutir padrões de arquitetura e resiliência!
Criado com ❤️ e .NET