【问题标题】:Refactoring method return value from async Task<Either<RouteError, object>> to EitherAsync<RouteError, object>将方法返回值从异步 Task<Either<RouteError, object>> 重构为 EitherAsync<RouteError, object>
【发布时间】:2018-12-12 03:23:22
【问题描述】:

我正在为 Web 服务器库制作 language-ext 和功能代码样式的原型,以便在我的项目之间共享。我真的很喜欢使用 LINQ 查询语法绑定 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 然后根据结果返回左或右。与带有Task 返回值的漂亮而干净的原始实现相比,到目前为止我尝试的所有东西看起来都很难看。

【问题讨论】:

  • IRequestDispatcher.Send 返回什么类型?

标签: c# language-ext


【解决方案1】:

看起来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();

这样做是通过在Task&lt;TryOption&lt;object&gt;&gt; 上调用ToAsyncTryOption 转换为TryOptionAsync,然后在该TryOptionAsync 上匹配以返回一个Task&lt;Either&lt;RouteError, object&gt;&gt;,然后最后在其上调用ToAsync()Task 转换为EitherAsync

【讨论】:

  • 抱歉,我忘记在我的问题中包含请求调度程序接口的签名。它现在被添加到问题中。 Send 返回的实际上是 Task&lt;OptionalResult&lt;object&gt;&gt;。如果不建议这样做,我也可以更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2019-10-23
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多