domingo, 5 de março de 2017

Padrão de Repositório no C#

O artigo .NET - Apresentando o padrão de projeto Repository do Macoratti faz uma breve explicação do padrão de repositório e apresenta exemplos de códigos c# para implementá-lo.

O vídeo abaixo  Repository Pattern with C# and Entity Framework, Done Right do canal Programming with Mosh faz um detalhamento maior, confrontando ideias encontradas na internet e também foi utilizado como fonte para este post.


Repositório, de acordo com de Martin Fowler, tem por definição:
Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects.
Media entre as camadas de domínio e mapeamento de dados usando uma interface tipo coleções para acessar objetos de domínio (Tradução livre do autor do post)

Os benefícios ao usar este padrão são:
  1. Minimiza duplicações de lógicas de consultas(query)
  2. Desacopla sua aplicação de frameworks de persistência. Dessa forma você pode começar com o acesso a dados com o Entity Framework e depois mudar para o Dapper em caso de necessidade de melhor performance (como dito no post  Acesso a Dados e Desempenho)
  3. Deixar o código mais testável

Alguns erros comuns de desenvolvedores

1 - Repositório não deve repetir métodos do banco de dados

Um repositório não deve espelhar métodos de um banco de dados. Por exemplo, a atualização de um objeto deve ser feita apenas atualizando o objeto consultado. A persistência no banco de dados deve ser feita com o Unit Of Work.

O Martin Fowler define o Unit of Work como:
Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.
Mantém uma lista de objetos afetados por uma transação de negócio e coordena a escrita de mudanças e resoluções de problemas de concorrência (Tradução livre do autor do post)
O autor do vídeo defende que se devee evitar o retorno de IQuery no repositório, para forçar a criação de métodos específicos para a busca de dados e ter o benefício número 1 - este padrão não é respeitado no código do Aspnet Boilerplate.  Ele também defende que a definição do Lazy ou Eager Loading também deve ser feita internamente no repositório e exposto a camada de negócio em métodos específicos.

2 - Nem toda aplicação deve usar este padrão

Deve-se tomar o cuidado para não fazer o over engineering (usar mais detalhes de arquitetura que o problema precisa). Se estiver prototipando ou um código que provavelmente não irá para a produção, talvez não precise desse investimento neste padrão.

 Código

O código utilizado no vídeo está disponível neste link para download.
Neste link está documentada a implementação de repositório do Aspnet Boilerplate.


No vídeo também é indicado o livro

Clean Code: A Handbook of Agile Software Craftsmanship do autor Robert C. Martin