Estou mergulhando no Domain Driven Design e alguns dos conceitos que estou me deparando fazem muito sentido na superfície, mas quando penso mais sobre eles, tenho que me perguntar se essa é realmente uma boa ideia.
O conceito de agregados, por exemplo, faz sentido. Você cria pequenos domínios de propriedade para não precisar lidar com todo o modelo de domínio.
No entanto, quando penso sobre isso no contexto de um aplicativo Web, frequentemente acessamos o banco de dados para recuperar pequenos subconjuntos de dados. Por exemplo, uma página pode listar apenas o número de pedidos, com links para clicar para abrir o pedido e ver seus IDs de pedidos.
Se eu sou Agregados entendimento correto, eu normalmente usaria o padrão de repositório para retornar um OrderAggregate que conteria os membros GetAll
, GetByID
, Delete
, e Save
. OK isso parece bom. Mas...
Se eu chamar GetAll para listar todos os meus pedidos, parece-me que esse padrão exigiria a devolução de toda a lista de informações agregadas, pedidos completos, linhas de pedidos, etc ... Quando eu precisar apenas de um pequeno subconjunto dessas informações (apenas informações do cabeçalho).
Estou esquecendo de algo? Ou existe algum nível de otimização que você usaria aqui? Não consigo imaginar que alguém advogaria o retorno de agregados inteiros de informações quando você não precisar.
Certamente, pode-se criar métodos no seu repositório GetOrderHeaders
, mas isso parece anular o propósito de usar um repositório como o padrão em primeiro lugar.
Alguém pode esclarecer isso pra mim?
EDITAR:
Depois de muito mais pesquisa, acho que a desconexão aqui é que um padrão de Repositório puro é diferente do que a maioria das pessoas pensa que um Repositório é.
Fowler define um repositório como um armazenamento de dados que usa semântica de coleção e geralmente é mantido na memória. Isso significa criar um gráfico de objeto inteiro.
Evans altera o Repositório para incluir Raízes Agregadas e, portanto, o repositório é amputado para suportar apenas os objetos em um Agregado.
A maioria das pessoas parece pensar nos repositórios como objetos de acesso a dados glorificados, onde você apenas cria métodos para obter os dados que deseja. Essa não parece ser a intenção, conforme descrito em Patterns of Enterprise Application Architecture de Fowler.
Outros ainda pensam em um repositório como uma abstração simples usada principalmente para facilitar testes e zombarias, ou para desacoplar a persistência do resto do sistema.
Acho que a resposta é que esse é um conceito muito mais complexo do que eu pensava.