首页/文章列表/文章详情

.NET 结果与错误处理利器 FluentResults

编程知识1942024-08-01评论

前言

在项目开发中,方法返回的结果(成功或失败)对我们开发来说很重要。传统方法,如通过异常来指示错误或使用特定的返回类型(如布尔值加输出参数),虽然有效,但可能缺乏直观性和灵活性。

FluentResults库应运而生,它以一种既流畅又富有表达力的方式,极大地优化了这一过程。通过使用FluentResults,能够以一种更加自然和易于理解的方式传递操作结果,包括成功状态、错误信息、警告以及额外信息,提高代码的可读性和可维护性。

这种方式不仅让错误处理更加集中和一致,还使得代码结构更加清晰,逻辑更加流畅。

项目介绍

FluentResults 是一个在 .NET 环境中广泛使用的库,它提供了一种优雅的方式来处理方法执行的结果和错误。

使用 FluentResults,可以很容易地创建包含成功值、错误、警告或信息的对象,并通过链式调用来处理这些对象。

那么如何使用 FluentResults 来优雅地处理结果和错误信息呢?

使用 FluentResults

1、安装 FluentResults

首先,在项目中安装 FluentResults,可以通过 NuGet 包管理器来安装。在 Visual Studio 中也可以通过 NuGet 包管理器控制台输入以下命令:

Install-Package FluentResults

或者,在项目文件中添加 NuGet 包引用。

2、创建 Result 对象

使用Result类的静态方法来创建结果对象。Result类提供了多种方法来创建不同类型的结果,例如成功、失败、带有警告或信息的成功等。

using FluentResults; ​staticvoidMain(string[] args){ var result = IsInteger("");​if (result.IsSuccess) { Console.WriteLine($"结果:{result.Value}"); } else { Console.WriteLine($"结果:{result.Reasons[0].Message}|{result.Errors[0].Message}"); }}​publicstaticResult<int> IsInteger(stringinput){//假设输入为空或null,我们可以选择认为它不是数字if(string.IsNullOrWhiteSpace(input)) { returnResult.Fail<int>("输入为空或null,无法判断是否是数字"); } //使用int.TryParse尝试将输入转换为整数//如果转换成功,out参数将包含转换后的值,方法返回true//如果转换失败,方法返回falseif(int.TryParse(input,outint result)) { return Result.Ok(result); } //如果无法转换为整数,则认为输入不是数字returnResult.Fail<int>("输入不是数字");}

运行结果

通过使用Result 类我们可以看到,方法运行返回了标准的接口参数,包括IsSuccess,Message,Errors等参数,帮我们快速实现返回结构。

3、链式处理结果

FluentResults允许你通过链式调用来处理结果,这使得错误处理和逻辑流程更加清晰和直观。

需要注意的是FluentResults 本身的 Result类型并不直接提供OnSuccessOnFailure 这样的链式方法,因为这些方法可能是在 FluentResults 的某个版本中以扩展方法的形式添加的,或者是在基于 FluentResults 的自定义扩展中定义的。

自定义扩展类

///<summary>/// Result 扩展方法 ///</summary>publicstaticclass ResultExtensions { ///<summary>///成功回调///</summary>///<param name="result"></param>///<param name="successAction"></param>///<returns></returns>publicstatic Result OnSuccess(this Result result, Action successAction) { if (result.IsSuccess) { successAction?.Invoke(); } returnresult;//返回结果以支持链式调用}​///<summary>///失败回调///</summary>///<param name="result"></param>///<param name="failureAction"></param>///<returns></returns>publicstatic Result OnFailure(this Result result, Action<IError> failureAction) { if (!result.IsSuccess && result.Errors!= null) { foreach(varerrorin result.Errors) { failureAction?.Invoke(error); } } returnresult;//返回结果以支持链式调用 } }

自定义方法

///<summary>///验证输入字符串是否为整数///</summary>///<param name="input"></param>///<returns></returns>publicstatic Result IsIntegerInfo(stringinput){//假设输入为空或null,我们可以选择认为它不是数字if(string.IsNullOrWhiteSpace(input)) { returnResult.Fail("输入为空或null,无法判断是否是数字"); } //使用int.TryParse尝试将输入转换为整数//如果转换成功,out参数将包含转换后的值,方法返回true//如果转换失败,方法返回falseif(int.TryParse(input,outint result)) { return Result.Ok(); } //如果无法转换为整数,则认为输入不是数字returnResult.Fail("输入不是数字");}

调用示例

var result = IsIntegerInfo("") .OnSuccess(() =>{//处理成功的情况Console.WriteLine("Success!"); }) .OnFailure(error =>{//处理失败的情况Console.WriteLine("Failed:"+ error.Message); }); // 注意:在 OnSuccess 或 OnFailure 中使用 result 变量可能不是安全的, //因为这些回调可能在这些回调执行之前就被修改了。// 更好的做法是在 OnSuccess/OnFailure 的 lambda 表达式中使用局部变量。

运行结果

 

在这个示例中定义了两个扩展方法OnSuccessOnFailure,它们分别接受成功和失败时要执行的回调函数。这些方法首先检查Result对象的状态,然后根据状态调用相应的回调函数。最后,它们返回原始的Result对象,以支持链式调用。

请注意,示例是为了说明目的而简化的,并且可能不包含 FluentResults 库中实际可用的所有功能和优化。在实际应用中,应该查看 FluentResults 的文档和源代码,以了解提供的具体功能。

4、FluentResults 高级特性

FluentResults提供许多高级特性,如链式调用、自定义错误类型、以及包含额外数据和元数据的错误对象。

例如,可以使用Result.Fail的重载版本来包含更多的上下文信息

returnResult.Fail("输入错误.").WithError("The input value must be greater than zero.");

5、自定义 Result 类型

FluentResults还支持通过继承Result类来创建自定义的结果类型,以便在结果中携带额外的数据或状态。

publicclassCommonResult{public Result Result { get; } publicstring MyData { get; }​ public CommonResult(Result result, string myData) { Result = result; MyData = myData; Console.WriteLine($"{nameof(CommonResult)}: {MyData}|{result}"); }}

调用示例

publicstatic CommonResult DemoResult(string input) { bool isSuccess =false;string errorMessage = "输入的字符串不是数字";string myData = "测试一下";​ Result result = isSuccess ? Result.Ok() : Result.Fail(errorMessage); returnnew CommonResult(result, myData); }

运行结果

通过以上步骤,可以在 .NET 应用快速、方便的使用 FluentResults来处理结果和错误。可以提高代码的可读性和可维护性,还可以使错误处理更加集中和统一规范。

使用场景

  • API 开发:在处理 HTTP 请求和响应时,FluentResults 构建清晰、一致和易于理解的错误响应。
  • 业务逻辑验证:在执行业务逻辑验证时,FluentResults 可以验证多个错误,并一次性返回。
  • 复杂操作的结果处理:当需要处理包含多个步骤的复杂操作时,FluentResults 可以帮助管理每个步骤的结果,并将它们组合成一个最终的结果。

总结

FluentResults 提供了丰富的 API,可以灵活使用,与现有的 .NET 代码库和框架集成,如 ASP.NET Core、Entity Framework 等,还可以与其他第三方库一起使用,以提供更全面的错误处理和结果功能。

如果你的项目中需要一种更好的方式来处理结果,并希望提高代码的可读性和可维护性,那么 FluentResults 是一个不错的选择。

开源地址

https://github.com/altmann/FluentResults

如果觉得这篇文章对你有用,欢迎加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行交流心得,共同成长。

博客园

这个人很懒...

用户评论 (0)

发表评论

captcha