【问题标题】:Language-ext: chain Either<L, R> with Option?Language-ext:使用 Option 链接 Either<L, R>?
【发布时间】:2021-09-08 18:36:24
【问题描述】:

我刚开始使用语言扩展,尝试在我的 Azure 函数中使用它。

在这个函数中,我首先使用一些验证器解析/验证来自 HTTP 请求的 POST 数据。 这个验证器返回一个 Either。 然后我想将一个服务调用链接到任一结果上,该服务调用应该使用请求模型从 API 中获取一些数据并返回一个选项。 在链的最后,如果第一步中存在 ValidationErrors,我想返回一个 IActionResult BadRequest,或者对服务调用 Option 的结果执行匹配以返回 NotFoundResult 或 ObjectResult。

我遇到的问题是,如果我想在 Either 之后链接我的服务调用(使用 Bind 或 BiBind),那么我的服务方法的签名必须是一些 Either,这是不正确的,因为我的服务方法与 ValidationErrors 无关。它应该只返回一个选项。

所以我想我的问题是如何将任何 ValidationErrors 保留到链的末尾,并能够将带有 Option 签名的服务调用链接到 Either?

【问题讨论】:

    标签: language-ext


    【解决方案1】:

    你必须决定你的链式表达式的结果是什么。

    选项:

    var maybeResult = from validated in GetValidationResult(...).ToOption()
                      from apiResult in ApiCall(...)
                      select apiResult;
    

    要么:

    var resultOrError = from validated in GetValidationResult(...)
                        from apiResult in ApiCall(...).ToEither(*LEFT*)
                        select apiResult;
    

    您必须将 *LEFT* 替换为某个错误值或返回相同类型的错误生成函数,例如 left 类型的 GetValidationResult

    用你自己的代码替换上面的伪代码,看看上面用到的函数的返回类型,看看发生了什么。

    你需要一个通用的left 类型的原因是绑定操作可以返回一些left(错误)的第一个(GetValidationResult)或第二个(ApiCall)函数调用——或者你最后一个( ApiCall) 函数,如果你到达你的链的成功结束。

    建议:如果您混合使用不同的 left(错误)返回类型,您可能想要使用类似 LanguageExt 的内置 Error 类型或者可能只是纯字符串(或 Exception)。

    string 作为错误类型:

    var resultOrError = from validated in GetValidationResult(...).MapLeft(Prelude.toString)
                        from apiResult in ApiCall(...).ToEither("api call failed")
                        select apiResult;
    

    补充说明:我这里使用的是LINQ风格,你可以使用方法风格:

    var resultOrError = GetValidationResult(...)
                        .MapLeft(Prelude.toString)
                        .Bind(validated => ApiCall(...)
                                           .ToEither("api call failed"));
    
    

    【讨论】:

    • 感谢@stb 的回答。根据您的回复,很清楚如何进行。最后,我使用类似于以下代码的代码来执行请求模型创建、验证、调用我的服务并生成响应。我在流程中使用了 Either。在错误中,我记得它是否是验证错误。最后,当我将结果与 IActionResult 匹配时,我使用验证属性将错误转换为 IActionResult。当错误是验证错误时,我创建一个 BadRequest 结果,否则我创建一个 InternalServerError 结果。
    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2019-06-06
    • 2018-06-23
    • 1970-01-01
    • 2012-08-19
    • 2020-06-18
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多