私はC#5.0で初めてのアプリケーションを作成することに興奮していました。私はasync/awaitキーワードを使用して、非同期データ呼び出しの苦労を緩和しました。インターフェイスでasyncキーワードが不足しているため、C#5.0のDIが壊れていませんか?
awaitキーワードは非同期マークされたメソッドに対してのみ機能するため、インターフェイスでは非同期キーワードを契約の一部にすることはできません。これは、インタフェース参照を通じて非同期メソッドを呼び出すことは不可能であることを意味します。これは抽象メソッドにも適用されます。私はここに何かを逃していますかこれは私の通常の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;
}
}
は私がする必要があります抽象化とランゲージ機能のどちらかを選択しますか?私に何かが足りないと教えてください。
いずれかの抽象化は、いずれかの方法で漏洩します。しかし、それは問題ではありません。非同期パターンを実装する方法を提供するだけです。 IAsyncResultを返すだけで十分です。 –