Я создаю прототип language-ext
и стиль функционального кода для библиотеки веб-сервера, которую можно использовать в моих проектах.Мне действительно нравится связывание async
шагов с использованием синтаксиса запроса LINQ, но теперь я столкнулся с такой проблемой компилятора: language-ext Задача Either с несколькими предложениями from .
Для реализации предложенного решенияв этой ссылке мне нужно было бы провести рефакторинг этого метода:
private static async Task<Either<RouteError, object>> DispatchRequest<T>(
IRequestDispatcher requestDispatcher,
T request)
where T : class, IRequest
{
var result = await requestDispatcher.Send(request);
return result.Match<Either<RouteError, object>>(
Some: x => x,
None: () => new NotFoundError(),
Fail: ex => new InternalServerError(ex));
}
, где requestDispatcher - это реализация:
public interface IRequestDispatcher
{
Task<OptionalResult<object>> Send<T>(T request) where T : IRequest;
}
Вместо этого мне нужен метод с этой сигнатурой, чтобыего легче использовать в выражениях LINQ:
private static EitherAsync<RouteError, object> DispatchRequest<T>(
IRequestDispatcher requestDispatcher,
T request)
where T : class, IRequest
{
// What should the implementation look like?
}
Я не могу понять, как создать метод, чтобы я мог await
и затем возвращать влево или вправо на основе результата.Все, что я пробовал до сих пор, также выглядит безобразно по сравнению с красивой и чистой исходной реализацией с возвращаемым значением Task
.