我正在为web服务器库创建language-ext和功能代码样式的原型,以便在我的项目之间共享。我真的很喜欢使用LINQ query语法绑定async步骤,但是我现在遇到了这个编译器问题:language-ext Task of Either with multiple from clauses。
要在该链接中实现建议的解决方案,我需要重构此方法:
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,然后根据结果返回Left或Right。到目前为止,我尝试过的所有东西与漂亮干净的原始实现相比也很难看,它的返回值是Task。
发布于 2018-12-07 23:59:13
看起来像是Send返回了TryOption?如果是这样,那么您可以这样做:
private static EitherAsync<RouteError, object> DispatchRequest<T>(
IRequestDispatcher requestDispatcher, T request)
where T : class, IRequest =>
Send(request)
.ToAsync();
.Match(Some: Right<RouteError, object>,
None: () => Left<RouteError, object>(new NotFoundError()),
Fail: ex => Left<RouteError, object>(new InternalServerError(ex)))
.ToAsync();这样做是通过调用TryOption上的ToAsync将Task<TryOption<object>>转换为TryOptionAsync,然后匹配该TryOptionAsync以返回Task<Either<RouteError, object>>,最后调用ToAsync()将Task转换为EitherAsync。
https://stackoverflow.com/questions/53627831
复制相似问题