Sto sviluppando un'applicazione che consuma dati da un servizio esterno. L'applicazione viene implementata seguendo una tipica architettura a più livelli con livelli di interfaccia utente, presentazione, dominio e dati. Il client del servizio risiede nel livello dati.
Come in genere, non voglio che l'interfaccia utente si "blocchi" mentre si attende il completamento delle chiamate dal servizio esterno. Tuttavia, l'implementazione degli agenti di servizio con metodi asincroni genera un modello complicato che concatena i metodi asincroni dei livelli in modo che l'interfaccia utente possa rimanere reattiva.
Ad esempio:
Nel ViewModel:
TheRepository.LoadDataAsync().ContinueWith(t => { _data = t.Result; });
In TheRepository:
public Task<TheData> LoadDataAsync()
{
return ServiceClient.GetDataFromServiceAsync();
}
(Nota, questa è una significativa semplificazione eccessiva intesa a trasmettere ciò che intendo per concatenazione di attività.)
Poiché il requisito è un requisito dell'interfaccia utente (impedisce all'interfaccia utente di "bloccare"), non ha senso mantenere i livelli Dominio e Dati in modo sincrono e lasciarlo al livello Presentazione per decidere quando è necessario eseguire alcuni operazione in modo asincrono?
D'altra parte, è molto semplice e naturale implementare il servizio client / proxy con metodi asincroni (VS li auto-genererà se necessario) perché questo è ciò che pensiamo quando pensiamo alla necessità di async.
Se l'applicazione estraeva i dati da un database invece di effettuare una chiamata di servizio, i livelli non sarebbero diversi e non dovrebbe davvero cambiare il modo in cui sono stati implementati i livelli dell'interfaccia utente, della presentazione o del dominio, giusto? In questo caso, non ci penseremmo due volte a fare in modo che l'accesso ai dati sia sincrono.
Sarebbe un progetto migliore modellare il Dominio in modo sincrono e lasciarlo al livello Presentazione per risolvere i problemi di prestazioni nell'interfaccia utente? Oppure, nel mondo emergente asincrono, dovremmo semplicemente accettare asincrono come norma e fare in modo che tutto si adatti a questo modello?