Задать вопрос
@M-Misha-M
горе-junior, программирую на C#, изучаю .Net

Как правильно использовать async/await в «Репозиторий-Сервис-Контроллер» архитектуре?

Здравствуйте. Есть клас-обёртка BaseResponseDataModel. В контроллере метод из сервиса вызывается следуючщим образом
public async Task<BaseResponseDataModel<List<Item>>> GetLatest(int num)
  {
       var items = await _IItemsService.GetLatestAsync(num);
       return new BaseResponseDataModel<List<Item>>(true, items.Data);
   }


Сервис выглядит так:

public Task<BaseResponseDataModel<List<Item>>> GetLatestAsync(int num)
        {
           //... logic here
            var items =  _itemsRepository.GetItems(num);
           return  new BaseResponseDataModel<List<Item>>(true, items.ToList());
        }

Соответственно репозиторий
public Item[] GetItems(int num)
        {
            return _db.Items.OrderByDescending(x => x.CreatedDate).Take(num).ToArray();
        }

Конечно же ошибка компиляции в сервисе на return так как оно хочет чтобы я дописал async в обьявлении. Так вот я новичок в асинхронных методах. У меня репозиторий тоже должен быть async? Или как правильно мне работать в сервис методе? Спасибо
  • Вопрос задан
  • 518 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@dmitryKovalskiy
программист средней руки
Метод GetLatestAsync у вас обещает вернуть Task, а возвращает объект. объявите его асинхронным(async).
То что вы не вызываете внутри асинхронных методом - асинхронные какие-либо другие методы конечно плохо, но не смертельно.
Какие есть пути решения?
1) Ваш репозиторий должен работать асинхронно(если используете EF - у него есть все необходимые методы. Если используете ADO.NET - зависит от версии .NET. Можно подключить Dapper и репозиторий тоже станет асинхронным)
2) убрать async/await из объявления метода GetLatestAsync. Пусть просто вернет модель, а не Task<Модель>. Опять же - ваш интерфейс обещает одно, а делает другое. Если внутри реализации нет асинхронности - накой вы ее объявили? На будущее? Тогда см. п.1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы