8

Tome este ejemplo simple, artificial:Repositorio, servicio o objeto de dominio: ¿a dónde pertenece la lógica?

UserRepository.GetAllUsers(); UserRepository.GetUserById();

Inevitablemente, voy a tener "consultas" más complejas, tales como:

//returns users where active=true, deleted=false, and confirmed = true 
GetActiveUsers(); 

Tengo problemas para determinar dónde termina la responsabilidad del repositorio. GetActiveUsers() representa una simple "consulta". ¿Pertenece al repositorio?

¿Qué tal algo que implica un poco de lógica, como por ejemplo:

//activate the user, set the activationCode to "used", etc. 
ActivateUser(string activationCode); 

Respuesta

3

Los repositorios son responsables del manejo específico de la aplicación de los conjuntos de objetos. Esto naturalmente cubre consultas así como también establece modificaciones (insertar/borrar).

ActivateUser opera en un solo objeto. Ese objeto necesita ser recuperado, luego modificado. El repositorio es responsable de recuperar el objeto del conjunto; otra clase sería responsable de invocar la consulta y usar el objeto.

2

Estos son todos excelentes preguntas a pedir. Ser capaz de determinar cuál de estos debe usar se reduce a su experiencia y el problema en el que está trabajando.

Sugiero leer un libro como Fowler's patterns of enterprise architecture. En este libro él discute los patrones que mencionas. Lo más importante es que asigna a cada patrón una responsabilidad . Por ejemplo, la lógica de dominio se puede colocar en las capas Servicio o Dominio. Hay pros y contras asociados con cada uno.

Si decido usar una capa de servicio, asigno a la capa el rol de manejar las transacciones y la autorización. Me gusta mantenerlo 'delgado' y no tengo lógica de dominio allí. Se convierte en una API para mi aplicación. Mantengo toda la lógica comercial con los objetos de dominio. Esto incluye algoritmos y validación para el objeto. El repositorio recupera y persiste los objetos del dominio. Esto puede ser un mapeo uno a uno entre columnas de bases de datos y propiedades de dominio para sistemas simples.

Creo que GetAtcitveUsers está bien para el repositorio. No querrá recuperar a todos los usuarios de la base de datos y descubrir cuáles están activos en la aplicación, ya que esto llevaría a un bajo rendimiento. Si ActivateUser tiene una lógica de negocios como usted sugiere, entonces esa lógica pertenece al objeto de dominio. Persistir en el cambio es responsabilidad de la capa Repositorio.

Espero que esto ayude.

+0

En respuesta a su último párrafo: ¿Qué pasa si "persistir el cambio" ES la única lógica. p.ej. ActivateUser() simplemente actualiza un registro en la tabla User y un registro en la tabla ActivationCode. ¿Eso constituye "lógica"? Si no, ¿qué hace? – betitall

2

Al construir proyectos DDD, me gusta diferenciar dos responsabilidades: un Repositorio y un Buscador.

Un repositorio es responsable de almacenar las raíces agregadas y de recuperarlas, pero solo para el uso en el procesamiento de comandos. Por procesamiento de comandos me refería a ejecutar cualquier acción invocada por un usuario.

Un Buscador es responsable de consultar los objetos de dominio a los fines de la IU, como vistas de cuadrícula y vistas de detalles.

No considero que los buscadores formen parte del modelo de dominio.Las interfaces de IXxxFinder particulares se colocan en la capa de presentación, no en la capa de dominio. La implementación tanto de IXxxRepository como de IXxxFinder se coloca en la capa de acceso a datos, posiblemente incluso en la misma clase.

Cuestiones relacionadas