Byłem podekscytowany, aby utworzyć moją pierwszą aplikację z C# 5.0, i chciałem użyć słów kluczowych async/czekaj, aby złagodzić bóle asynchronicznych połączeń danych.Czy brak asynchronicznego słowa kluczowego w interfejsach powoduje przerwanie DI w C# 5.0?
Jestem nieco zakłopotany, że interfejsy nie pozwalają na asynchroniczne słowo kluczowe, które jest częścią umowy, ponieważ słowo kluczowe oczekuje tylko na asynchroniczne metody zaznaczone. Oznaczałoby to, że niemożliwe jest wywoływanie metod asynchronicznych za pomocą odwołań do interfejsu. Dotyczy to również metod abstrakcyjnych. Czy coś mi umyka? Oznaczałoby to, że mój regularny DI-rzeczy nie będą już działać:
IAsyncRepository<T> {
Task<IList<T>> GetAsync(); // no 'async' allowed
}
abstract class AsyncRepositoryBase<T> {
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed
// kod klienta:
IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>();
var items = await repo.GetAsync(); // DOOOOOH, will not compile!
To jest mój obecny rozwiązanie:
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;
}
}
Czy muszę wybrać między abstrakcją a funkcją langauge? Proszę powiedz mi, że czegoś mi brakuje.
Wszelkie abstrakcje są nieszczelne w taki czy inny sposób. Ale to nie jest problem, wystarczy podać sposób implementacji wzorca asynchronicznego. Zwracanie funkcji IAsyncResult jest wystarczające. –