Ero entusiasta di creare la mia prima app con C# 5.0, e volevo usare le parole chiave asincrone/attese per alleviare il dolore delle chiamate dati asincrone.La mancanza della parola chiave async nelle interfacce interrompe il DI in C# 5.0?
Sono un po 'sconcertato che le interfacce non consentano che la parola chiave async faccia parte del contratto, poiché la parola chiave await funziona solo per i metodi con segno asincrono. Ciò significherebbe che è impossibile chiamare i metodi asincroni attraverso i riferimenti all'interfaccia. Questo vale anche per i metodi astratti. Mi sto perdendo qualcosa qui? Ciò significherebbe che il mio normale DI-roba non funzionerà più:
IAsyncRepository<T> {
Task<IList<T>> GetAsync(); // no 'async' allowed
}
abstract class AsyncRepositoryBase<T> {
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed
// codice client:
IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>();
var items = await repo.GetAsync(); // DOOOOOH, will not compile!
Questa è la mia soluzione attuale:
public abstract class AsyncRepositoryBase<T>
{
protected Task<IList<T>> _fetcherTask;
protected AsyncRepositoryBase(Task<IList<T>> fetcherTask)
{
_fetcherTask = fetcherTask;
}
public virtual async Task<IList<T>> GetASync()
{
return await _fetcherTask;
}
}
Ci sono diritti da scegliere tra l'astrazione e la funzionalità langauge? Per favore dimmi che mi manca qualcosa.
Qualsiasi astrazione perde in un modo o nell'altro. Ma non è un problema, devi solo fornire un modo per implementare il modello asincrono. Restituire IAsyncResult è sufficiente. –