J'essaie de concevoir une application qui a un domaine commercial complexe et une exigence pour prendre en charge une API REST (pas strictement REST, mais orientée vers les ressources). J'ai du mal à trouver un moyen d'exposer le modèle de domaine d'une manière orientée vers les ressources.
Dans DDD, les clients d'un modèle de domaine doivent passer par la couche procédurale «Services d'application» pour accéder à toutes les fonctionnalités métier mises en œuvre par les entités et les services de domaine. Par exemple, il existe un service d'application avec deux méthodes pour mettre à jour une entité utilisateur:
userService.ChangeName(name);
userService.ChangeEmail(email);
L'API de ce service d'application expose des commandes (verbes, procédures) et non des états.
Mais si nous devons également fournir une API RESTful pour la même application, il existe un modèle de ressource utilisateur, qui ressemble à ceci:
{
name:"name",
email:"email@mail.com"
}
L'API orientée ressources expose l' état , pas les commandes . Cela soulève les préoccupations suivantes:
chaque opération de mise à jour par rapport à une API REST peut être mappée à un ou plusieurs appels de procédure Application Service, selon les propriétés mises à jour sur le modèle de ressource
chaque opération de mise à jour ressemble à atomique au client API REST, mais elle n'est pas implémentée comme ça. Chaque appel Application Service est conçu comme une transaction distincte. La mise à jour d'un champ sur un modèle de ressource peut modifier les règles de validation pour d'autres champs. Nous devons donc valider tous les champs du modèle de ressource ensemble pour nous assurer que tous les appels potentiels du service d'application sont valides avant de commencer à les effectuer. Valider un ensemble de commandes à la fois est beaucoup moins trivial que d'en faire une à la fois. Comment faire cela sur un client qui ne sait même pas qu'il existe des commandes individuelles?
appeler des méthodes Application Service dans un ordre différent peut avoir un effet différent, tandis que l'API REST donne l'impression qu'il n'y a pas de différence (au sein d'une ressource)
Je pourrais trouver des problèmes plus similaires, mais fondamentalement, ils sont tous causés par la même chose. Après chaque appel à un service d'application, l'état du système change. Les règles de ce qui est un changement valide, l'ensemble des actions qu'une entité peut effectuer le prochain changement. Une API orientée ressources essaie de faire ressembler le tout à une opération atomique. Mais la complexité de franchir cet écart doit aller quelque part, et cela semble énorme.
De plus, si l'interface utilisateur est plus orientée commande, ce qui est souvent le cas, nous devrons alors mapper entre les commandes et les ressources côté client, puis de nouveau côté API.
Des questions:
- Toute cette complexité doit-elle être gérée par une couche de mappage REST-AppService (épaisse)?
- Ou est-ce que je manque quelque chose dans ma compréhension de DDD / REST?
- REST pourrait-il simplement ne pas être pratique pour exposer la fonctionnalité des modèles de domaine sur un certain degré (assez faible) de complexité?