Gostaria de saber o seguinte: suponha que estamos construindo um sistema em que precisa haver alguma funcionalidade de filtragem para procurar alguma entidade. Por exemplo, pode-se aplicar a filtragem a uma tabela que lista as entidades para encontrar algo ou usá-lo para gerar um relatório em um conjunto filtrado, qualquer que seja.
O ponto é: precisamos ter uma lógica de filtragem em algum lugar. Uma maneira ruim de fazer isso seria replicar a lógica de filtragem sempre que necessário. Já fiz isso uma vez e é uma péssima ideia.
Por outro lado, acredito que deve haver um método como o Filter(FilteringOptions filteringOptions)
projetado para executar a operação de filtragem e retornar a lista filtrada de entidades.
Agora, IMHO, a lógica de filtragem é uma lógica de negócios amável. Os especialistas em negócios são os que sabem como a filtragem ocorre, que coisas são filtradas e como. Por isso, acredito que a lógica de filtragem deve estar localizada na camada de domínio.
Eu encontrei duas opções para fazer isso: incorporar o método de filtragem no repositório correspondente para essa entidade específica ou criar um serviço de domínio como o EntityNameSearchService
que consumiria o repositório para executar a filtragem.
Ainda estou confuso qual seria o melhor caminho. Então, se estou tentando usar o DDD corretamente, onde essa lógica de filtragem deve estar? No repositório ou em um serviço separado?
Get*
método genérico e introduzir filtros diferentes ou definidos pelo usuário na camada de serviço. A decisão depende principalmente de você.