Estoy tratando de diseñar una aplicación que tenga un dominio comercial complejo y un requisito para admitir una API REST (no estrictamente REST, sino orientada a los recursos). Tengo algunos problemas para encontrar una manera de exponer el modelo de dominio de una manera orientada a los recursos.
En DDD, los clientes de un modelo de dominio deben pasar por la capa de 'Servicios de aplicación' de procedimiento para acceder a cualquier funcionalidad comercial, implementada por Entidades y Servicios de dominio. Por ejemplo, hay un servicio de aplicación con dos métodos para actualizar una entidad de usuario:
userService.ChangeName(name);
userService.ChangeEmail(email);
La API de este Servicio de aplicaciones expone comandos (verbos, procedimientos), no estados.
Pero si también necesitamos proporcionar una API RESTful para la misma aplicación, entonces hay un modelo de recursos de usuario, que se ve así:
{
name:"name",
email:"email@mail.com"
}
La API orientada a recursos expone el estado , no los comandos . Esto plantea las siguientes preocupaciones:
cada operación de actualización contra una API REST puede correlacionarse con una o más llamadas al procedimiento del Servicio de aplicaciones, según las propiedades que se actualicen en el modelo de recurso
cada operación de actualización parece atómica para el cliente REST API, pero no se implementa de esa manera. Cada llamada al Servicio de aplicaciones está diseñada como una transacción separada. Actualizar un campo en un modelo de recurso podría cambiar las reglas de validación para otros campos. Por lo tanto, debemos validar todos los campos del modelo de recursos juntos para asegurarnos de que todas las posibles llamadas al Servicio de aplicaciones sean válidas antes de comenzar a realizarlas. Validar un conjunto de comandos a la vez es mucho menos trivial que hacer uno a la vez. ¿Cómo hacemos eso en un cliente que ni siquiera sabe que existen comandos individuales?
llamar a los métodos de Application Service en un orden diferente podría tener un efecto diferente, mientras que REST API hace que parezca que no hay diferencia (dentro de un recurso)
Podría encontrar problemas más similares, pero básicamente todos son causados por lo mismo. Después de cada llamada a un Servicio de aplicaciones, el estado del sistema cambia. Reglas de lo que es un cambio válido, el conjunto de acciones que una entidad puede realizar el próximo cambio. Una API orientada a recursos intenta hacer que todo parezca una operación atómica. Pero la complejidad de cruzar esta brecha debe ir a alguna parte, y parece enorme.
Además, si la interfaz de usuario está más orientada a los comandos, que a menudo es el caso, entonces tendremos que asignar entre comandos y recursos en el lado del cliente y luego nuevamente en el lado de la API.
Preguntas:
- ¿Debería toda esta complejidad ser manejada por una capa de mapeo REST-to-AppService (gruesa)?
- ¿O me falta algo en mi comprensión de DDD / REST?
- ¿Podría REST simplemente no ser práctico para exponer la funcionalidad de los modelos de dominio en un cierto (bastante bajo) grado de complejidad?