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.