我刚刚开始使用language-ext,尝试在我的Azure函数中使用它。
在这个函数中,我首先使用一些验证器解析/验证来自HTTP请求的POSTed数据。这个验证器返回一个Either。然后,我想将一个服务调用链接到任一结果上,该服务调用应该使用请求模型从API获取一些数据,并返回一个选项。在链的末尾,如果在第一步中有ValidationErrors,我想返回一个IActionResult BadRequest,或者在服务调用选项的结果上执行匹配,以返回NotFoundResult或ObjectResult。
我遇到的问题是,如果我想在Either之后链接我的服务调用(使用Bind或BiBind),那么我的服务方法的签名必须是某个Either,这是不正确的,因为我的服务方法与ValidationErrors无关。它应该只返回一个选项。
所以我想我的问题是,如何将任何ValidationErrors保留到链的末尾,并能够将带有选项签名的服务调用链接到任何一个上?
发布于 2021-06-25 21:50:07
你必须决定你的链接表达式的结果是什么。
选项:
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*,比如GetValidationResult的left类型。
将上面的伪代码替换为您自己的代码,并查看上面使用的函数的返回类型,看看是怎么回事。
之所以需要一个通用的left类型,是因为绑定操作可能会返回第一个(GetValidationResult)或第二个(ApiCall)函数调用的一些错误( left ) --或者如果到达链的成功端,则返回最后一个(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"));https://stackoverflow.com/questions/68129760
复制相似问题