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:
Postar um comentário