@WhiteNinja

Как использовать async/await в DI контейнере ASP.NET CORE?

Добрый день!

Есть некий сервис:

public interface ISomeService {
	Task<Some> GetSomeAsync();
}


При этом нужно добавить в DI контейнер результат метода GetSomeAsync, т.е. Some.

Получается следующее:

services.AddScoped<ISomeService, SomeService>();
services.AddScoped(x => {
	var some = await x.GetService<ISomeService>().GetSomeAsync();
});


Соответственно второй AddScoped выдает ошибку компилятора, так как нет async. Если добавить async x => то компилятор не ругается, но решение не работает. Приложение не может заресолвить Some.

Огромная просьба подсказать, как через провайдер добавить вызов метода GetSomeAsync() ?
  • Вопрос задан
  • 348 просмотров
Пригласить эксперта
Ответы на вопрос 2
@basrach
Посмотрите на сигнатуру второго вызова AddScoped. В Visual Studio это можно сделать наведя указатель на метод.
Она будет такой: AddScoped>(x => ... Т.е. в контейнере регистрируется не Some, а Task. И это нормально, асинхронный метод всегда возвращает Task. Чтобы зарегистрировать Some, нужно чтобы лямбда внутри AddScoped была синхронная, этого можно достичь написав либо ...GetSomeAsync().Result, либо еще как-то получить результат, и непосредственно его уже возвратить.
Ответ написан
Комментировать
@Artemka95
А это точно должно быть на уровне DI?
По моему, здесь в логике что-то не так, если из контейнера надо разрезолвить результат асинхронной операции.
В любом случае, может попробовать зарегистрировать не Some а Func> и резолвить конкретно его.
Стандартный DI контейнер поддерживает такой вариант
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы