Je pense que vous pouvez avoir un processus utilisateur à la discordance d'implémentation ici.
Premièrement: un utilisateur voudra-t-il honnêtement effectuer plusieurs modifications simultanément sur un fichier? Un changement de nom (qui peut ou non inclure un changement de chemin?), Un changement de propriétaire et peut-être un changement de contenu de fichier (par souci d'argument) semblent être des actions distinctes.
Prenons le cas où la réponse est "oui" - vos utilisateurs veulent vraiment faire ces changements simultanément.
Dans ce cas, je vous recommande fortement contre toute mise en œuvre qui envoie plusieurs événements - RenameFileCommand
, MoveFileCommand
, ChangeOwnerCommand
- pour représenter cette seule intention de l' utilisateur.
Pourquoi? Parce que les événements peuvent échouer. C'est peut-être extrêmement rare, mais votre utilisateur a soumis une opération qui semblait atomique - si un seul des événements en aval échoue, l'état de votre application n'est plus valide.
Vous invitez également les dangers de la course sur une ressource qui est clairement partagée entre chacun des gestionnaires d'événements. Vous devrez écrire "ChangeOwnerCommand" de telle manière que le nom de fichier et le chemin d'accès au fichier n'aient pas d'importance, car ils pourraient être obsolètes au moment de la réception de la commande.
Lors de la mise en œuvre d'un système reposant non piloté par des événements avec déplacement et renommage de fichiers, je préfère garantir la cohérence en utilisant quelque chose comme un système eTag - assurez-vous que la version de la ressource en cours de modification est la version que l'utilisateur a récupérée en dernier, et échoue si elle a été modifié depuis. Mais si vous envoyez plusieurs commandes pour cette opération à utilisateur unique, vous devrez incrémenter la version de votre ressource après chaque commande - vous n'avez donc aucun moyen de savoir que la ressource que l'utilisateur modifie est vraiment la même version que la ressource qu'il a lue en dernier. .
Ce que je veux dire par là, c'est que si quelqu'un d'autre effectue une autre opération sur le fichier presque en même temps. Les 6 commandes peuvent s'empiler dans n'importe quel ordre. Si nous n'avions que 2 commandes atomiques, la commande précédente pourrait réussir et la commande suivante pourrait échouer "la ressource a été modifiée depuis sa dernière récupération". Mais il n'y a aucune protection contre cela lorsque les commandes ne sont pas atomiques, donc la cohérence du système est violée.
Fait intéressant, il existe un mouvement vers quelque chose comme une architecture basée sur les événements dans REST, appelée "Rest without PUT", recommandée dans le radar de la technologie Thoughtworks, janvier 2015 . Il y a un blog considérablement plus long sur Rest without PUT ici .
Essentiellement, l'idée est que POST, PUT, DELETE et GET conviennent parfaitement aux petites applications, mais lorsque vous devez commencer à supposer que put, post et delete peuvent être interprétés à l'autre extrémité, vous introduisez le couplage. (par exemple "quand JE SUPPRIME la ressource associée à mon compte bancaire, le compte doit être fermé") Et la solution proposée est de traiter REST de manière plus sourcée par l'événement. ie permet de POSTER l'intention de l'utilisateur en tant que ressource d'événement unique.
L'autre cas est plus simple. Si vos utilisateurs ne veulent pas effectuer toutes ces opérations simultanément, ne les laissez pas. POSTER un événement pour chaque intention d'utilisateur. Vous pouvez maintenant utiliser le contrôle de version etag sur vos ressources.
Quant aux autres applications qui utilisent une API très différente de vos ressources. Ça sent le trouble. Pouvez-vous construire une façade de l'ancienne API au-dessus de votre API RESTful et les pointer vers la façade? c'est-à-dire exposer un service qui effectue plusieurs mises à jour d'un fichier en séquence via le serveur REST?
Si vous ne créez pas l'interface RESTful au-dessus de l'ancienne solution, ni ne construisez une façade de l'ancienne interface au-dessus de la solution REST, et essayez de maintenir les deux API pointant vers une ressource de données partagée, vous rencontrerez des maux de tête majeurs.