O problema que enfrento continuamente é como lidar com valores computados conduzidos pela lógica do domínio enquanto ainda trabalhamos eficientemente no armazenamento de dados.
Exemplo:
Estou retornando uma lista de produtos do meu repositório por meio de um serviço. Essa lista é limitada pelas informações de paginação do DTO da solicitação enviado pelo cliente. Além disso, o DTO especifica um parâmetro de classificação (uma enumeração amigável ao cliente).
Em um cenário simples, tudo funciona muito bem: o serviço envia expressões de paginação e classificação ao repositório e o repositório emite uma consulta eficiente ao banco de dados.
Tudo isso se quebra, no entanto, quando eu preciso classificar os valores gerados na memória do meu modelo de domínio. Por exemplo, a classe Product possui um método IsExpired () que retorna um bool com base na lógica de negócios. Agora não consigo classificar e paginar no nível do repositório - tudo isso seria feito na memória (ineficiente) e meu serviço precisaria saber os meandros de quando emitir esses parâmetros para o repositório e quando realizar a classificação / paginação em si.
O único padrão que parece fazer sentido para mim é armazenar o estado da entidade no banco de dados (tornar IsExpired () um campo somente leitura e atualizá-lo pela lógica do domínio antes de salvar). Se eu separar essa lógica em um repositório separado "modelo de leitura / dto" e "relatório", estou tornando meu modelo mais anêmico do que gostaria.
BTW, todos os exemplos que eu vi por aí em cálculos como esse realmente parecem se apoiar no processamento e na memória da memória sobre o fato de que é muito menos eficiente a longo prazo. Talvez eu esteja otimizando prematuramente, mas isso não parece certo comigo.
Eu adoraria ouvir como os outros lidaram com isso, pois tenho certeza de que é comum em quase projetos envolvendo DDD.
fonte
Acho que questionaria qual é a lógica de negócios que determina se isExpired é verdadeiro ou não. Essa lógica pode ser executada por uma consulta como o modelo de dados permanece? Nesse caso, você pode tornar seu repositório inteligente o suficiente para usar a lógica "isExpired" quando solicitar produtos de uma determinada maneira? Caso contrário, talvez você precise reexaminar seu modelo de dados.
DDD não significa que seus repositórios precisam ser estúpidos - apenas significa que seu domínio precisa saber como conversar com seus repositórios.
fonte