Padrão Repository com ASP.NET Core e EF Core

Neste artigo será apresentado o padrão Repository, tão utilizado e importante na construção de aplicações alinhadas com princípios como separação de responsabilidade e inversão de dependência.

Será discutida a sua origem, benefícios, características e também um exemplo prático utilizando API com ASP.NET Core.

Vamos lá?

Sobre o Padrão Repository

Com origem no Domain-Driven Design, esse padrão propõe a criação de objetos, chamados Repositories, que gerenciam coleção de dados persistidos. Note que Repositories são agnósticos à tecnologia utilizada, não exigindo que seja um banco de dados, cache de memória, arquivo, ou qualquer outra fonte.

Falo mais de Microsserviços e DDD na playlist de vídeos do meu canal do YouTube, que você pode acessar clicando aqui.

De maneira mais alinhada com conceitos práticos: utilizamos o padrão Repository, em conjunto com interface, como uma abstração para o acesso ao dados, “protegendo” nossas camadas superiores de dependência a tecnologias de banco de dados, e melhorando sua testabilidade.

Entre seus principais benefícios estão:

  • Separação de responsabilidade de acesso a dados;
  • Menor acoplamento;
  • Melhor testabilidade ao ser utilizado com interface;

Com esses benefícios, acho que vale a pena pelo menos considerar seu uso em nossos sistemas, concorda?

Implementando com ASP.NET Core e EF Core

Antes de mostrar a implementação dele, que tal mostrar a versão sem esse padrão de projeto aplicado? Assim conseguimos visualizar melhor seus benefícios, facilitando o entendimento.

Analise o código abaixo de um Controller de uma API ASP.NET Core.

Controller sem o uso do padrão Repository

Existem alguns pontos para se melhorar nele, como:

  • Acoplamento do Controller ao EF Core;
  • Maior complexidade na configuração de testes unitários;
  • Concentração de responsabilidades de acesso a dados no Controller;

Algo que tenho escutado de vez em quando é que não é necessário aplicar o padrão Repository quando se utiliza o EF Core, pois já existe a classe DbContext para abstrair o acesso ao dados.

Apesar de que a classe de fato abstrai o acesso aos dados, afinal estamos falando de uma ORM, o Controller mostrado segue com os pontos de melhoria mostrados logo acima, não resolvendo questões como acoplamento, concentração de responsabilidades, e complexidade para criação de testes unitários.

Se pararmos para pensar, é exatamente nisso que o padrão Repository atua! Que tal aplicarmos ele?

Primeiro passo aqui é criar uma interface do nosso Repository que vai interagir com nossa entidade Customer. Baseado no nosso Controller, ela vai ter a definição dos métodos:

  • GetAll
  • GetById
  • Insert

A sua definição em código pode ser encontrada logo abaixo.

Interface ICustomerRepository

Após isso, criamos uma classe CustomerRepository para realizar a implementação dessa interface, transferindo o código de responsabilidade de acesso a dados que estava no Controller para a nova classe.

CustomerRepository, implementação de ICustomerRepository

Com isso feito, precisamos configurar a injeção de dependência para seu uso na classe Program.

E finalmente, atualizar o código do CustomersController para utilizar a interface ICustomerRepository via injeção de dependência.

CustomersController atualizado para utilizar o ICustomerRepository

Com isso feito, conseguimos ter uma melhor separação de responsabilidades e testabilidade, além de menor acoplamento. Uma melhoria nessa abordagem seria a utilização de uma camada de aplicação, que seria responsável por receber o modelo de entrada (se tiver), e coordenar a chamada para o(s) repositório(s) e outras dependências que possa ter na implementação do caso de uso.


Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o Método .NET Direto ao Ponto, minha plataforma com mais de 800 videoaulas, com cursos cobrindo temas relacionados a linguagem C# e Programação Orientada a Objetos, APIs REST com ASP NET Core, Microsserviços com ASP NET Core, HTML, CSS e JavaScript, Desenvolvimento Front-end com Angular, Desenvolvimento Front-end com React, JavaScript Intermediário, TypeScript, Formação Arquitetura de Software, Microsoft Azure, Agile, SQL, e muito mais.

Inclui comunidade de centenas de alunos, suporte por ela, plataforma e e-mail, atualizações regulares e muito mais.

Clique aqui para ter mais informações e garantir sua vaga


Conclusão

Neste artigo foi apresentado o padrão Repository, de maneira prática e direta ao ponto, junto a seus benefícios, e um cenário prático e comum em projetos de software. A refatoração para seu uso é simples, e vale muito a pena para a melhoria geral do desenho do código de projeto API com ASP.NET Core.