segunda-feira, 11 de maio de 2009

DDD: Repositório Genéricos

 

A utilização de repositórios genéricos em sistemas que aplicam Domain Driven Design é uma prática que vem sendo bastante utilizada.

As vantagens e desvantagens dessa prática foram levantadas pelo Greg Young com um post em seu blog.

O que realmente gostaria de descatar do blog é sobre a relação entre o repositório e o DDD. Greg diz o seguinte.

“Looking back to [DDD, Evans] one will see that it is to represent a series of objects as if they were a collection in memory so that the domain can be freed of persistence concerns. In other words the goal is to put collection semantics on the objects in persistence.”

O repositório deve representar os dados como se estivessem em memória sem se preocupar com um armazenador de dados específico.

Quando utilizamos o repositório como um contrato entre todos os armazenadores de dados, garantimos que, independente da forma que o mesmo se utilizará para realizar a ação, os dados serão manipulados da forma esperada.

O trecho de código exemplifica exatamente a diferença entre uma ação genérica e uma específica:

Repository<T>.FindAllMatching(QueryObject o);
CustomerRepository.FindCustomerByFirstName(string);

Quanto mais genérico for uma “ação” maiores serão suas dificuldades em manter o “contrato” entre o seu domínio e armazenadores de dados.

Mas mesmo assim, Greg Young demostra como ter um bom reaproveitamento de código através de composição utilizando repositório genéricos conforme trecho abaixo:

Public class CustomerRepository {
    private Repository<Customer> internalGenericRepository;
    Public IEnumerable<Customer> GetCustomersWithFirstNameOf(string _Name) {
         internalGenericRepository.FetchByQueryObject(new CustomerFirstNameOfQuery(_Name)); //could be hql or whatever
     }
}

Este post é apenas um resumo do post do Greg das coisas que me chamaram mais a atenção, recomendo que você leia o post original e principalmente os comentários do pessoal.

Nenhum comentário: