首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重构方法从异步Task<Either<RouteError、object>>返回值到EitherAsync<RouteError、object>

重构方法从异步Task<Either<RouteError、object>>返回值到EitherAsync<RouteError、object>
EN

Stack Overflow用户
提问于 2018-12-05 16:14:10
回答 1查看 433关注 0票数 1

我正在为web服务器库创建language-ext和功能代码样式的原型,以便在我的项目之间共享。我真的很喜欢使用LINQ query语法绑定async步骤,但是我现在遇到了这个编译器问题:language-ext Task of Either with multiple from clauses

要在该链接中实现建议的解决方案,我需要重构此方法:

代码语言:javascript
复制
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是以下各项的实现:

代码语言:javascript
复制
public interface IRequestDispatcher
{
    Task<OptionalResult<object>> Send<T>(T request) where T : IRequest;
}

我需要的是一个具有此签名的方法,以便可以更容易地在LINQ表达式中使用它:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-12-07 23:59:13

看起来像是Send返回了TryOption?如果是这样,那么您可以这样做:

代码语言:javascript
复制
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上的ToAsyncTask<TryOption<object>>转换为TryOptionAsync,然后匹配该TryOptionAsync以返回Task<Either<RouteError, object>>,最后调用ToAsync()Task转换为EitherAsync

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53627831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档