En un modelo de dominio muchas reglas y operaciones pueden ubicarse naturalmente en entidades u objetos de valor. Un Turno puede saber si está cancelado. Un Rango horario puede validar que su inicio sea anterior a su fin. Un Pedido puede calcular su total. Pero algunas operaciones importantes no pertenecen claramente a un solo objeto.
Cuando una operación del negocio involucra varios conceptos y no encaja naturalmente en una entidad u objeto de valor, puede aparecer un servicio de dominio. Su función es representar una acción o regla del dominio sin forzarla dentro de un concepto que no debería tener esa responsabilidad.
Un servicio de dominio es una operación significativa del negocio que no se ubica de manera natural en una entidad o en un objeto de valor. Suele coordinar varios conceptos del dominio, aplicar una política o resolver una decisión que involucra más de un objeto.
Por ejemplo, Calcular disponibilidad de turnos puede necesitar Agenda, Profesional, Especialidad, Franjas horarias, Bloqueos y Turnos existentes. Si esa lógica no pertenece claramente a una sola entidad, puede modelarse como servicio de dominio.
La necesidad de un servicio de dominio aparece cuando una operación:
El servicio evita que una entidad acumule responsabilidades que no le corresponden.
En un sistema de turnos, calcular disponibilidad puede requerir revisar la agenda del profesional, las franjas horarias, los turnos ya reservados, bloqueos por ausencia, duración según especialidad y reglas de sobreturnos.
Podríamos preguntar: ¿debería Profesional calcular disponibilidad?, ¿debería hacerlo Agenda?, ¿debería hacerlo Especialidad? Si la operación depende de todos esos conceptos y expresa una regla del dominio, puede tener sentido modelar un servicio llamado Servicio de disponibilidad o Calculador de disponibilidad.
Cancelar un turno puede implicar más que cambiar un estado. Puede requerir evaluar anticipación, tipo de paciente, historial de inasistencias, motivo de cancelación y reglas de penalización. Si esa política es compleja y no pertenece solo a Turno, puede modelarse como servicio de dominio.
El servicio no reemplaza a la entidad Turno. La entidad puede seguir protegiendo invariantes propios, mientras el servicio coordina una política más amplia.
Una entidad tiene identidad y continuidad. Un servicio de dominio no tiene identidad propia. No representa una cosa del negocio que deba seguirse a través del tiempo. Representa una operación, regla o coordinación.
Por ejemplo, Paciente es una entidad. Turno es una entidad. Política de cancelación o Calculador de disponibilidad no son entidades si solo representan comportamiento. No necesitamos distinguir una instancia histórica de otra como parte central del dominio, salvo que el negocio tenga reglas específicas sobre versiones de políticas.
Un objeto de valor representa un valor significativo que se compara por atributos. Un servicio de dominio representa comportamiento. Dinero, Rango horario o Dirección pueden ser objetos de valor. Calcular total, evaluar disponibilidad o aplicar penalización son operaciones.
Si el elemento tiene datos, igualdad por atributos y significado como valor, puede ser objeto de valor. Si lo principal es una operación de dominio sin identidad, puede ser servicio.
Un servicio de aplicación coordina casos de uso, seguridad, transacciones, acceso a repositorios, envío de respuestas o interacción con infraestructura. Un servicio de dominio contiene lógica del negocio.
Por ejemplo, un servicio de aplicación puede recibir la solicitud de cancelar turno, cargar el turno desde un repositorio y guardar cambios. El servicio de dominio puede evaluar la política de cancelación y decidir si corresponde penalización.
Una utilidad técnica realiza tareas generales como formatear fechas, enviar correos, convertir archivos o generar identificadores. Eso no es servicio de dominio, aunque sea útil para el sistema.
Un servicio de dominio debe estar nombrado con lenguaje del negocio y resolver una operación significativa para el dominio. Si el nombre suena técnico y no puede explicarse a expertos del negocio, probablemente no sea un servicio de dominio.
Los servicios de dominio deben usar nombres del lenguaje ubicuo. Nombres como Evaluador de elegibilidad, Calculador de disponibilidad, Política de cancelación o Servicio de asignación de turnos pueden tener sentido si el negocio reconoce esas operaciones.
Evitemos nombres genéricos como Manager, Helper, Processor o Util si no dicen nada sobre el dominio. Un nombre pobre oculta la regla que el servicio representa.
Por lo general, un servicio de dominio no tiene estado propio persistente. Puede recibir entidades, objetos de valor y parámetros, aplicar reglas y devolver un resultado. Si empieza a tener identidad, historial y ciclo de vida propio, quizás no sea un servicio sino un concepto del dominio que debe modelarse de otra manera.
Esto no significa que la operación no pueda depender de datos. Significa que esos datos pertenecen a entidades, objetos de valor, políticas o repositorios conceptuales, no al servicio como identidad central.
La siguiente tabla muestra posibles servicios de dominio:
| Servicio de dominio | Conceptos que coordina | Responsabilidad |
|---|---|---|
| Calculador de disponibilidad | Agenda, Profesional, Turno, Franja horaria. | Determinar horarios disponibles según reglas. |
| Política de cancelación | Turno, Paciente, Cancelación, Historial. | Decidir si una cancelación es válida y si genera penalización. |
| Evaluador de elegibilidad | Paciente, Cobertura, Especialidad. | Determinar si el paciente puede acceder a una prestación. |
| Calculador de precio | Pedido, Ítems, Descuentos, Impuestos. | Calcular importe final según reglas comerciales. |
| Asignador de profesional | Solicitud, Profesional, Especialidad, Agenda. | Elegir profesional disponible según criterios del dominio. |
Estas preguntas ayudan a decidir si una operación puede ser servicio de dominio:
Los servicios de dominio son útiles, pero pueden usarse en exceso. Si toda la lógica se coloca en servicios y las entidades quedan como simples datos, el modelo se vuelve anémico: tiene nombres de dominio pero poco comportamiento propio.
Antes de crear un servicio, conviene preguntar si la responsabilidad pertenece naturalmente a una entidad u objeto de valor. El servicio debe usarse cuando realmente aporta claridad, no como lugar automático para cualquier regla.
Al modelar servicios de dominio, suelen aparecer estos errores:
Los servicios de dominio ayudan a ubicar operaciones del negocio que no pertenecen naturalmente a un solo concepto. Permiten representar cálculos, políticas y decisiones que coordinan varios elementos del modelo sin forzar responsabilidades dentro de entidades incorrectas.
En el próximo tema estudiaremos los agregados, que permiten definir límites de consistencia y proteger reglas internas del dominio.