Sto scrivendo un'app che è in ascolto su una connessione di rete, e quando alcuni dati arrivano, risponde e, a seconda dei dati in arrivo, potrebbe essere necessario chiedere all'utente (mostra la finestra di dialogo) prima di rispondere.Come ottenere in modo pulito l'input dell'utente dal centro del metodo del modello nell'architettura Model-View-Viewmodel?
Non so come farlo in modo pulito nell'architettura MV-VM: gli eventi e il binding alle raccolte osservabili sono carini se ho bisogno di aggiornare solo la GUI in base ai dati in arrivo, ma cosa succede se ho effettivamente bisogno di una anwer da utente prima di rispondere?
E per peggiorare le cose, voglio farlo in modo sincrono, perché voglio che l'algoritmo di risposta sia in un posto, non suddiviso in più callback con responsabilità "chi chiama-chi" non chiare.
Semplicemente, qualcosa come
HandleMessage(Message msg){
string reply;
if (msg.type == 1) {
reply = ...
} else {
string question = msg...
reply = ShowModalDialog(question); // MVVM violation!
}
sender.Send(reply);
}
ma non voglio chiamare vista o viewmodel dal modello, come il modello ha bisogno di essere riutilizzabili e verificabile - io non voglio popping finestre di dialogo in ogni prova, e sarebbe una violazione di MVVM! Non ci sono eventi (sono solo a senso unico, per quanto ne so, e non hanno alcun canale a ritroso per ottenere risposta all'origine degli eventi) o al database, in quanto sarebbe asincrono.
È fattibile? Questa è una domanda che ho posto a diversi propagatori di sviluppo basati su test, e fino ad ora non ho ottenuto una risposta praticamente utilizzabile. Tuttavia, la necessità di alcuni input aggiuntivi nel mezzo dell'elaborazione è abbastanza comune.
Grazie!
EDIT: questa è la logica dell'applicazione, quindi appartiene chiaramente al modello, e anche se in questo caso non lo fosse, mi piacerebbe conoscere la soluzione per i casi in cui ho davvero bisogno di input dell'utente nel mezzo del business routine logica nel modello.
+1 per averlo spiegato molto meglio di quanto ho fatto io. –
Grazie, sembra una soluzione pulita, leggerò i collegamenti (grazie per loro!) –