.NET Core - Implementando o padrão Repositório - II


  Hoje veremos como implementar o padrão repositório na plataforma .NET Core.

No artigo anterior definimos a interface do nosso repositório e fizemos sua implementação na classe Repositorio.

O que é uma interface ?

Uma interface, no paradigma da orientação a objetos, é  um tipo de classe que contém apenas as assinaturas de métodos, propriedades, eventos e indexadores.

A implementação dos membros é feita por uma classe concreta ou struct que implementa a interface.

Agora vamos detalhar e entender cada método implementado.

private readonly AppDbContext _context;
public Repository(AppDbContext context)
{
    _context = context;
}

Neste código estamos referenciando o contexto representando por AppDbContext na variável _context e estamos injetando uma instância do contexto no construtor e atribuindo o valor a essa variável.

Precisamos usar uma instância do context para poder acessar os dados e realizar a persistência via EF Core.

public IEnumerable<T> Get()
{
    return _context.Set<T>().AsEnumerable<T>();
}

O método Get() recebe uma entidade (uma classe) e retorna um IEnumerable,  ou seja uma lista completa das entidades. Aqui o método Set<T> do contexto retorna uma instância DbSet<T> para o acesso a entidades de determinado tipo no contexto.

Para entender melhor o IEnumerable veja o artigo :  .NET - Comparando IEnumerable com IQueryable.

public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)
{
     return _context.Set<T>().Where(predicate).AsEnumerable<T>();
}

Neste código temos o método Get() que usa um delegate Func<> como parâmetro de entrada, onde será usada uma expressão lambda (Ex: p => p.ClienteId == ID) como critério, e, um predicate para validar o critério usando a cláusula Where. O retorno será uma lista IEnumerable.

Para entender melhor o delegate Func<> veja o meu artigo: C# - Apresentando o delegate Func

public T GetById(Expression<Func<T, bool>> predicate)
{
            return _context.Set<T>().SingleOrDefault(predicate);
}

Neste código temos o método GeById() que usa um delegate Func<> como parâmetro de entrada, onde será usada uma expressão lambda (Ex: p => p.ClienteId == ID) como critério, e, um predicate para validar o critério usando a expressão SingleOrDefault() retornado um objeto do tipo T.

        public void Add(T entity)
        {
            _context.Set<T>().Add(entity);
        }
        public void Delete(T entity)
        {
            _context.Set<T>().Remove(entity);
        }   

Os métodos Add() e Delete() recebem uma entidade do tipo T, e, usam a instância do contexto para realizar a operação pertinente usando os métodos Add(), Remove().

        public void Update(T entity)
        {
            _context.Entry(entity).State = EntityState.Modified;
            _context.Set<T>().Update(entity);
        }

O método Update recebe uma entidade e define o seu EntityState como Modified informando ao contexto que a entidade foi alterada e usando o método Update() para atualizar a entidade.

O estado da entidade é uma enumeração do tipo System.Data.EntityState que declara os seguintes valores:

  1. Added - A entidade é marcada como adicionada;
  2. Deleted - A entidade é marcada como deletada;
  3. Modified - A entidade foi modificada;
  4. Unchanged - A entidade não foi modificada;
  5. Detached - A entidade não esta sendo tratada no contexto;   

O contexto não só trata a referência para todos os objetos recuperados do banco de dados, mas também detém os estados da entidade e mantém as modificações feitas nas propriedades da entidade. Este recurso é conhecido como controle de alterações ou ChangeTracking.

A mudança no estado da entidade de Unchanged para o estado Modified é o único estado que é feito automaticamente pelo contexto.

Os conceitos sobre Delegates (Func, Action, Predicate) e Expressões Lambdas são a base para entender o código usado na implementação feita.

Na próxima parte do artigo vamos implementar padrão Unit Of Work.

(Jesus a seus discípulos) "Na verdade, na verdade vos digo que vós chorareis e vos lamentareis, e o mundo se alegrará, e vós estareis tristes, mas a vossa tristeza se converterá em alegria."
João 16:20

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti