Me pregunto lo siguiente: supongamos que estamos construyendo un sistema en el que debe haber alguna funcionalidad de filtrado para buscar alguna entidad. Por ejemplo, uno podría querer aplicar el filtrado a una tabla que enumere las entidades para encontrar algo, o usarlo para generar un informe en un conjunto filtrado, lo que sea.
El punto es: necesitamos tener una lógica de filtrado en alguna parte. Una mala forma de hacerlo sería replicar la lógica de filtrado donde sea necesario. Lo hice una vez y es una idea terrible.
Por otro lado, creo que debería haber un método como Filter(FilteringOptions filteringOptions)
diseñado para realizar la operación de filtrado y devolver la lista filtrada de entidades.
Ahora, en mi humilde opinión, la lógica de filtrado es una buena lógica de negocios. Los expertos en negocios son los que saben cómo se realiza el filtrado, qué elementos se filtran y cómo. Por eso, creo que la lógica de filtrado debe ubicarse en la capa de dominio.
He encontrado dos opciones para hacer esto: incrustar el método de filtrado en el repositorio correspondiente para esa entidad en particular, o bien, crear un servicio de dominio como EntityNameSearchService
que consumiría el repositorio para realizar el filtrado.
Todavía estoy confundido cuál sería la mejor manera. Entonces, si estoy tratando de usar DDD correctamente, ¿dónde debería estar esta lógica de filtrado? ¿En el repositorio o en un servicio separado?
Get*
método genérico e introducir filtros diferentes o definidos por el usuario en la capa de servicio. La decisión depende principalmente de usted.