Убойный релиз: MediatR теперь могет в AsyncEnumerableНе особо давно у MediatR случился релизец, в котором библиотеку научили работать с AsyncEnumerable и это довольно охуенно, друзья.
https://jimmybogard.com/mediatr-10-0-released/Вообще я фан IAsyncEnumerable и всей этой фичи, поскольку она реально улучшает работу вашего приложения с потоками.
👎А еще всегда удобно делать не вот это говно:
List<object> result = new List<object>();
foreach (var value in someCrazyList)
{
var shit = await RequestShitFromDB(value);
result.Add(shit);
}
return result;
👍А просто и лаконично написать красоту:
foreach (var value in someCrazyList)
{
yield return await RequestShitFromDB(value);
}
Но перейдем к сути релиза.
❌ Раньше вы не могли вернуть IAsyncEnumerable в хэндлере, то есть сделать так:
public async IAsyncEnumerable<WeatherResponse> Handle(WeatherRequest request, CancellationToken cancellationToken)
✅Но после 6-го января 2022 года
(видать на новогодних Джимми Боггарт не оливьеху наворачивал! 🥗
) Вы можете делать асинхронные энумераторы в хэндлерах! Выглядит оно вот так. Вид от лица хэндлера, так сказать:
public async IAsyncEnumerable<WeatherResponse> Handle(WeatherRequest request, CancellationToken cancellationToken)
{
for (int i = 0; i < request.DaysCount; i++)
{
// imitation of DB
await Task.Delay(100, cancellationToken);
yield return new WeatherResponse
{
Date = DateTime.Now.AddDays(i),
TemperatureC = Random.Shared.Next(-20, 55)
};
}
}
А вот как это выглядит в контроллере:
[HttpGet(Name = "GetWeatherForecast")]
public IAsyncEnumerable<WeatherResponse> Get([FromQuery]WeatherRequest request)
{
return _mediator.CreateStream(request);
}
Не знаю по каким причинам, но меня трясет от страха, при виде слова Stream. Ни малейшего понятия, почему так. Возможно из-за собесов (
ставь лайк если тоже заебали заумные собесы). Но тут можно не бояться, ибо метод CreateStream это тот же Send, только с другим возвращаемым типом. Думаю, не нужно пояснять с каким (
IAsyncEnumerable).
🅰️
Итого: Вы спросите меня, а что делать-то, Димас? А вот что! Если у вас в приложении есть MediatR и где-то вы собираете рузльтат, прежде чем отдать его, то выпиливайте эту срань к чертям и меняйте на прекрасный AsyncEnumerable!
PS. А ты поставил, кстати, звезду ⭐ медиатру на гитхабе? Если нет, то помни, Джимми старался на новогодних ради тебя, возможно не ел оливьеху. Поставь ему звезду, не постесняйся, а он тебе еще апдейтов накидает 🤩
https://github.com/jbogard/MediatR