je la tâche suivante:CQRS et commandes debouncing
- architecture actuelle SPA Web avec CQRS et MVVM. Nous avons commandes, requêtes et SingnalR comme bus de message.
- Les utilisateurs peuvent sélectionner, déplacer, redimensionner des divs sur le même espace de travail à partir de plusieurs navigateurs Web simultanément.
- Chaque div est lié au ViewModel approprié. Chaque ViewModel a sa propre requête à actualiser. Chaque ViewModel s'est abonné à des événements métier et a actualisé l'état entier après.
Lets image utilisateur fait les étapes suivantes:
- Sélectionnez div (SelectWidgetCommand envoyé)
- Déplacer div à x = 10. (ChangePositionCommand envoyé)
- Déplacer div vers x = 100. (ChangePositionCommand envoyé)
Le problème est que les commandes sont fire-and-forget et que l'utilisateur peut recevoir l'événement WidgetSelectedEvent au cours de l'étape 3, mais que ChangePositionCommand n'est peut-être pas encore géré. Ainsi, l'utilisateur recevra l'ancienne position x et la div ira à l'ancienne position.
Quelle est la meilleure pratique pour gérer ce genre de problèmes?
Ce que nous faisons maintenant est de diviser le DivViewModel en deux divs: SelectionViewModel, PositionViewModel. Chaque ViewModel a sa propre requête à actualiser et différents événements à gérer. Nous considérons également l'utilisation de Debounce et de Rolling Buffer pour la gestion des commandes.
Votre solution semble être une bonne solution. Séparer en modèles plus petits, chacun synchronisé à travers un sous-ensemble spécifique d'événements. Une autre solution que je pourrais envisager serait d'avoir un seul modèle, mais créer des mappages d'attributs d'événements (par exemple mapper Map ViewModel.position à ChangePositionCommand.position). Tant que vos événements ne sont pas reçus dans le désordre, cela devrait fonctionner. Au fait, il est étrange d'avoir une commande selecton gérée côté serveur. L'état de sélection ne peut-il pas exister uniquement sur le client? – plalx
@plalx Nous avons la même sélection pour tous les utilisateurs qui travaillent sur un espace de travail –
N'est-ce pas créer un conflit inutile qui empêche presque la collaboration? Que faire si la sélection est modifiée par l'utilisateur B alors que l'utilisateur A essayait d'exécuter une commande sur sa sélection d'origine? – plalx