Domanda

Ho letto il testo di Udi Dahan su [Separazione delle query dei comandi e SOA] [1].Pensare a come lo utilizzerei nella pratica in un sistema su cui sto attualmente lavorando ha sollevato alcune domande...


1.

Considera la seguente situazione in cui ho un'applicazione client WPF che consente all'utente di modificare un elenco di voci:

L'applicazione client viene avviata.All'avvio, si iscrive al servizio di comando che gestirà e pubblicherà le modifiche alle voci e interroga un servizio WCF per l'elenco completo delle voci.Dopo aver ricevuto l'elenco delle voci, eventuali modifiche (da parte di altri client) che potrebbero essere state pubblicate nella coda dei client mentre era impegnata in attesa di una risposta da WCF vengono unite nell'elenco.

Ora a me sembra che ci sia una possibilità (probabilmente molto piccola) che il client si iscriva subito dopo che è stato gestito un comando responsabile di una modifica e che la query del servizio WCS venga avviata appena prima che la stessa modifica sia stata inserita nel database.In questa situazione mi ritroverò con dati errati nel mio client che non sono (e non verranno mai sincronizzati) con il database (a meno che l'applicazione client non venga riavviata). Questo problema esiste davvero e, se esiste, come dovrebbe essere gestito?


2.La mia seconda domanda riguarda come progettare/implementare l'interfaccia utente:

L'utente ora vuole modificare una voce nell'elenco;viene visualizzata una finestra, i dati vengono modificati e viene premuto il pulsante ok:inviamo un messaggio al nostro gestore dei comandi per gestire questa modifica.L'utente prevede di visualizzare una conferma (la voce nell'elenco modifica) o un messaggio di errore.

Ora posso provare a gestire le cose nell'interfaccia utente in modo "sincrono" (lasciare che l'utente faccia una cosa alla volta e lasciarlo attendere il successo o il fallimento prima di poter fare qualsiasi altra cosa) nel modo seguente:

  1. Dopo che l'utente ha premuto OK, disabilita tutti i controlli in modo che non siano possibili ulteriori modifiche.
  2. Creare una Saga con un timeout che attende...?Il messaggio di risposta?La notifica pubblicata dal servizio di comando?Entrambi?
  3. Quando viene ricevuto un messaggio di risposta, i dati nell'elenco vengono modificati, i controlli vengono abilitati e il gioco è fatto -- oppure:
  4. Si verifica un timeout.Il messaggio di comando è stato messo in coda, quindi la modifica verrà eventualmente eseguita, quindi cosa fare?Mostrare un messaggio all'utente ("l'operazione sta richiedendo più tempo del previsto..."), abilitare tutti i controlli e modificare i dati nel client una volta ricevuta la notifica dal servizio di comando?Ma cosa succede se viene restituito un errore?L'utente potrebbe aver iniziato a fare qualcos'altro (magari modificando un'altra voce) e visualizzare un messaggio di errore da un precedente tentativo di modifica non sembra una buona idea.

Un altro approccio sarebbe probabilmente quello di inviare semplicemente il comando e lasciare che l'utente continui con qualunque cosa gli piaccia fare dopo.Forse mostrare tutti i comandi in sospeso in un elenco nell'interfaccia utente da qualche parte, con un indicatore di successo o fallimento e la possibilità per l'utente di visualizzare il messaggio di errore in caso di errore.Dato che si spera che i timeout siano eccezionali e che le risposte dovrebbero normalmente essere ricevute entro pochi secondi, ciò significherebbe che questo elenco dovrebbe normalmente contenere al massimo 1 comando in sospeso al suo interno.Questo e il fatto che non riesco a ricordare di aver mai visto un'interfaccia utente fare le cose in questo modo significa che probabilmente non è una buona idea.

E la tua domanda è?;)

Bene, mi sto solo chiedendo come gli altri stanno risolvendo questo problema nelle loro interfacce utente.Probabilmente ci sono modi migliori di gestire le cose nell'interfaccia utente rispetto ai due modi forse non così intelligenti che ho ideato?

Mi scuso per il testo lungo e grazie in anticipo per le vostre risposte.

[1]: http://www.udidahan.com/2008/08/11/command-query-separation-and-soa/"Separazione delle query dei comandi e SOA"

È stato utile?

Soluzione

Alla domanda numero 1, la soluzione standard per l'esecuzione di query consiste nel creare un archivio di query persistente lato server a cui risponde la richiesta/risposta RPC del client.

Alla domanda numero 2, la risposta dipende molto dal dominio: il tipo di comandi, la natura della collaborazione tra utenti.Come regola generale, pensa a come puoi modificare l'interfaccia utente e/o i dati/la gestione dei comandi in modo tale che i comandi difficilmente falliranno (a meno che non stiamo parlando di utenti malintenzionati).

Spero che aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top