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


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

No artigo anterior implementamos o repositório e agora vamos implementar o padrão Unit Of Work.

O que é o padrão Unit Of Work ?

Unit Of Work ou Unidade de Trabalho é um padrão de projeto, e, de acordo com Martin Fowler, o padrão de unidade de trabalho "mantém uma lista de objetos afetados por uma transação e coordena a escrita de mudanças e trata possíveis problemas de concorrência".

Qual a utilidade em usar o padrão Unit Of Work ?

Assim, implementar corretamente o padrão Unit Of Work, evita o problema de criar múltiplas instâncias da unidade de trabalho e permite realizar múltiplas chamadas ao método Commit() que persiste as informações em uma transação.

 

O objetivo é tornar a nossa camada de domínio baseada no Unit-of-Work e no Repositório mais simples e limpa o possível usando o mínimo de tipos e tornando-a realmente desacoplada e extensível.

Vamos então criar a interface IUnitOfWork na pasta Repository.

Clique com o botão direito sobre esta pasta e clique em Add -> New Item;

Selecione o template Interface, informe o nome IUnitOfwork.cs e clique no botão Add;

A seguir defina o código a seguir para esta interface:

using DataAccess.Domain;
namespace DataAccess.Repository
{
    public interface IUnitOfWork
    {
        IRepository<Cliente> ClienteRepository { get; }
        void Commit();
    }
}

Definimos um tipo Unit of Work abstrato (Interface) contendo todos os repositórios genéricos, no nosso exemplo temos apenas um repositório, fazendo parte da unidade de trabalho com um único método Commit() usado para persistir todas as alterações feitas nos repositórios para o correspondente banco de dados.

Assim a Unit-of-Work encapsula os repositórios e é ela quem gerencia a persistência das alterações na base de dados.

Agora para cada provedor de dados precisamos criar uma única implementação concreta da  nossa abstração IUnitOfWork e IRepositorio independente do número de repositórios.

Agora vamos criar a classe UnitOfWork que implementa esta interface na pasta Repository:

using DataAccess.Context;
using DataAccess.Domain;
using System;
namespace DataAccess.Repository
{
    public class UnitOfWork : IUnitOfWork, IDisposable
    {
        public AppDbContext _context;
        private Repository<Cliente> _clienteRepository;
        public UnitOfWork(AppDbContext context)
        {
            _context = context;
        }
        public UnitOfWork()
        {
            _context = new AppDbContext();
        }
        public IRepository<Cliente> ClienteRepository
        {
            get
            {
                return _clienteRepository = _clienteRepository ?? new Repository<Cliente>(_context);
            }
        }
        public void Commit()
        {
            _context.SaveChanges();
        }
        public void Dispose()
        {
            _context.Dispose();
        }
    }
}

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.

Temos acima a implementação da interface IUnitOfWork onde vemos que o construtor cria uma instância do contexto que aciona o correspondente DbSet.

Definimos outro construtor onde estamos injetando uma instância de UnitOfWork. Neste caso podemos usar um contâiner de injeção de dependência (ASP .NET Core, Ninject,etc.) para injetar essa instância.

Agora observe que na propriedade ClienteRepositoy estamos instanciando seus respectivos repositórios e passando como parâmetro uma instância do contexto garantindo assim que todos os repositórios usarão o mesmo DbContext.

Temos assim a nossa camada de acesso a dados pronta onde estamos usando o padrão repositório e o padrão unit of work.

Na próxima parte do artigo vamos criar a camada de negócios da nossa aplicação.

"Porque Deus não nos deu o espírito de temor, mas de fortaleza, e de amor, e de moderação."
2 Timóteo 1:7

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