Capa de Dominio y Servicios
En los apartados anteriores hemos construido los cimientos (Base de Datos) y las herramientas de traducción (JSON). Ahora vamos a crear la Capa de Servicio, el lugar donde reside la lógica de nuestra aplicación.
1 La Necesidad de una Capa de Servicio
¿Por qué no llamar al UsuariosDAO directamente desde las rutas de Ktor? Aunque en aplicaciones muy pequeñas funciona, en entornos profesionales usamos una capa intermedia llamada Service por tres razones clave:
- Abstracción: Si mañana cambiamos el DAO o usamos dos bases de datos distintas, el controlador (las rutas) no tiene por qué enterarse.
- Lógica de Negocio: El DAO solo sabe hacer CRUD. El Servicio sabe, por ejemplo, que no se puede registrar a un usuario si el email ya existe o si es menor de edad.
- Seguridad: Podemos filtrar datos sensibles o transformar objetos antes de que salgan a la red.
Flujo de Comunicación
El siguiente gráfico representa cómo interactúan los componentes en nuestra arquitectura modular:
graph LR
A[Routing / Controller] -- "1. Pide Datos" --> B[Service Layer]
B -- "2. Lógica y Validación" --> C[DAO Layer]
C -- "3. Consulta Exposed" --> D[(Base de Datos)]
D -- "4. Retorna Fila" --> C
C -- "5. Mapea a DTO" --> B
B -- "6. Envía DTO Limpio" --> A
2 Implementación del Servicio: UsuariosService.kt
El Servicio es el "empleado" que recibe órdenes del Controlador y utiliza al "especialista" (DAO) para ejecutarlas.
🔍 Ejecutar y Analizar
Crea el archivo UsuariosService.kt en la carpeta services. Observa cómo esta capa gestiona la lógica antes de tocar la base de datos.
Recuerda
TODA la lógica de negocio (reglas de validación, seguridad de datos, búsquedas previas, etc.) se realiza en la capa de Servicio (en el Controlador) y no en el DAO.
3 El Contrato de API: DTOs Serializables
Como vimos, el UsuarioDTO es nuestro contrato. Es la promesa de cómo se ven los datos tanto para el cliente (Frontend) como para el servidor.
🔍 Recordatorio del Modelo de Dominio
Asegúrate de que tu UsuarioDTO.kt sea el único objeto que viaja entre el Servicio y el Controlador. Esto mantiene la Capa de Datos (Tablas y Rows) totalmente oculta para el exterior.
4 Estructura de Carpetas Actualizada
Con la incorporación de los servicios, nuestra arquitectura modular queda así:
🎯 Práctica 3. Creando la capa de Servicio
🎯 Práctica para Aplicar
- Crea el paquete
servicesen tu proyecto. - Implementa el objeto
UsuariosServicesiguiendo el ejemplo anterior. - Reflexiona: ¿Qué otra regla de negocio podrías añadir? (Ej: Validar que el nombre no esté vacío o que la contraseña tenga una longitud mínima).
Llegados a este punto, el proyecto debe ser similar a esto:
