C#5.0 で最初のアプリを作成することに興奮し、async/await キーワードを使用して非同期データ呼び出しの問題を軽減したいと考えました。
await キーワードは async マークされたメソッドに対してのみ機能するため、インターフェイスが async キーワードをコントラクトの一部にすることを許可していないことに少し困惑しています。これは、インターフェイス参照を介して非同期メソッドを呼び出すことができないことを意味します。これは抽象メソッドにも当てはまります。ここで何か不足していますか?これは、私の通常の DI が機能しなくなることを意味します。
IAsyncRepository<T> {
Task<IList<T>> GetAsync(); // no 'async' allowed
}
abstract class AsyncRepositoryBase<T> {
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed
// クライアント コード:
IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>();
var items = await repo.GetAsync(); // DOOOOOH, will not compile!
これは私の現在の解決策です:
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;
}
}
抽象化と言語機能のどちらかを選択する必要がありますか? 何か足りないと教えてください。