Что я хочу
Мы используем AutoMapper , и весь наш уровень обслуживания асинхронный .Вот как выглядит наше отображение в действии API:
var response = (await this.service.GetAll())
.AsQueryable()
.ProjectTo<DataViewModel>();
...
Я хочу добиться чего-то вроде:
var response = await this.service
.GetAll()
.Map<DataViewModel>();
Что я сделал
Лучшее, что ядо сих пор достигнуто:
var response = await this.service
.GetAll()
.Map<DataServiceModel, DataViewModel>();
Методы расширения, выглядящие так:
// Task extension
public static async Task<IEnumerable<TDestination>> MapCollection<TSource, TDestination>(
this Task<IEnumerable<TSource>> collection)
=> (await collection)
.MapCollection<TDestination>();
// IEnumerable extension
public static IEnumerable<TDestination> MapCollection<TDestination>(
this IEnumerable collection)
{
foreach (var item in collection)
{
yield return Mapper.Map<TDestination>(item);
}
}
Это приемлемо, но в идеале я хотел бы удалить зависимость TSource
врасширение задачи, так как оно не требуется для логики сопоставления.
Проблема
Если я удалю TSource
, я не могу заставить компилятор согласиться со мной.Когда я пытаюсь использовать расширение, определенное так:
public static async Task<IEnumerable<TDestination>> MapCollection<TDestination>(
this Task<IEnumerable> collection)
=> (await collection)
.MapCollection<TDestination>();
, компилятор выкрикивает:
'Task<IEnumerable<DataServiceModel>>
', не содержит определения для 'MapCollection
' иЛучшая перегрузка метода расширения 'TaskExtensions.MapCollection<DataViewModel>(Task<IEnumerable>)
' требует приемника типа 'Task<IEnumerable>
'
Так что я не могу заставить его распознавать мой метод, если нет явного универсального TSource
.Я не понимаю, в чем проблема, так как компилятор согласен с моим расширением IEnumerable
, которое определено как
MapCollection<TDestination>(this IEnumerable collection)
, но не разрешает:
MapCollection<TDestination>(this Task<IEnumerable> collection)
Вопросы
- Можно ли как-то обойти вышеупомянутую проблему и определить мое расширение
Task
с помощью единственного универсального параметра, который ему действительно нужен? - Представляет ли использование
Task
проблемы с производительностью?Т.е. нить блокирует, тупики и тд.Я так не думаю, но мне все еще не хватает глубоких знаний в области программирования asnyc.