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

news/2024/11/14 13:07:17/文章来源:https://www.cnblogs.com/1312mn/p/18336221

前言

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

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

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

项目介绍

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

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

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

使用 FluentResults

1、安装 FluentResults

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

Install-Package FluentResults

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

2、创建 Result 对象

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

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

运行结果

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

3、链式处理结果

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

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

自定义扩展类

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

自定义方法

/// <summary>
/// 验证输入字符串是否为整数
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static Result IsIntegerInfo(string input)
{// 假设输入为空或null,我们可以选择认为它不是数字  if (string.IsNullOrWhiteSpace(input)){return Result.Fail("输入为空或null,无法判断是否是数字");}// 使用int.TryParse尝试将输入转换为整数  // 如果转换成功,out参数将包含转换后的值,方法返回true  // 如果转换失败,方法返回false  if (int.TryParse(input, out int result)){return Result.Ok();}// 如果无法转换为整数,则认为输入不是数字  return Result.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的重载版本来包含更多的上下文信息

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

5、自定义 Result 类型

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

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

调用示例

 public static CommonResult DemoResult(string input){bool isSuccess =false;string errorMessage = "输入的字符串不是数字";string myData = "测试一下";
​Result result = isSuccess ? Result.Ok() : Result.Fail(errorMessage);return new 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技术匠] 社区,与其他热爱技术的同行交流心得,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/776049.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# chart缩放,局部放大问题

左键划选放大区域,右键恢复/// <summary>/// 初始化,传入要进行初始化的chart/// </summary>/// <param name="chart1"></param>public static void InitChart (System.Windows.Forms.DataVisualization.Charting.Chart chart1){//开启缩放…

Charles证书一年过去后怎么处理?

1、删除证书 windows--》设置--》搜索(管理证书)--》右键删除2、重置证书3、重新安装证书 安装完后重启charles

阿里云CentOS7.x ECS云盘在线扩容操作

说明这里只介绍如何在线扩容 操作系统:CentOS 7.x 以下操作实现给200G云盘扩容至300G;操作步骤 创建快照 找到需要扩容的云盘,创建快照,避免扩容出问题数据丢失,阿里云快照是收付费的,快照时长设置1天即可;操作比较简。磁盘创建快照创建快照配置截图(保留时间设置1天)…

【BUUCTF】AreUSerialz

【BUUCTF】AreUSerialz (反序列化) 题目来源 收录于:BUUCTF  网鼎杯 2020 青龙组 题目描述 根据PHP代码进行反序列化 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $filename;protected $content;fu…

什么情况下你能接受 996

要是有更高的工资或者更好的学习机会,你会自愿接受“996”吗?文中还有粉丝投稿面经的详解,赶快来看看吧。在当下的职场环境中,996 工作制一直是一个备受争议的话题。“996”是一种工作制度的代称,指的是工作日早上 9 点上班,晚上 9 点下班,中午和傍晚休息 1 小时(或不到…

el-progress 自定义线状进度条右边的文字

需要展示类似下面的效果 搜了很多slot的方式试了都不行,好像是因为我后面的文字太长了导致了换行,加上这边需要加其他的样式,最后干脆将原始的文字变成空的,自己写右边的文字加样式了<divstyle="margin: 10px 0 20px 0"v-for="item in deptdata":ke…

SemanticKernel/C#:检索增强生成(RAG)简易实践

本文介绍了基于SemanticKernel/C#的检索增强生成(RAG)简易实践。检索增强生成(RAG)是什么? RAG是“Reference-based Generative model with Attention”的缩写,也可以被称为“Retrieval-Augmented Generation”,是一种结合了检索技术和生成模型的方法,主要用于自然语言处理…

docker-compose搭建elk

一、准备检查自己的docker 和 docker-compose是否安装完毕,切换docker的镜像源二、安装本次安装的主要组件 包括es 、filebeat、kibana、logstash2.1 先配置组件的挂载点 2.2 配置各组件的相关配置文件es-->config---&g…

save-all-resources | 将指定页面的所有资源存到本地 | chrome插件推荐

save-all-resources https://chromewebstore.google.com/detail/save-all-resources/abpdnfjocnmdomablahdcfnoggeeiedb使用方法: F12 右边选择 ResourceSaver点击右边的 Save All Resources 按钮即可--------------------------------------------- 生活的意义就是你自己知道…

低代码如何借助 K8s 实现高并发支持?

引言 在当今这个数字化时代,互联网的普及和技术的飞速发展使得应用程序面临着前所未有的挑战,其中最为显著的就是高并发访问的需求。随着用户数量的激增和业务规模的扩大,如何确保应用在高并发场景下依然能够稳定运行、快速响应,成为了所有开发者和技术团队必须面对的重要课…

02.计算器存储器的原理

02.计算器存储器的原理 目录介绍01.什么是存储器1.1 了解存储器是什么 1.2 存储器类型02.存储器系统设计2.1 存储器分层设计 2.2 存储器层次结构 2.3 高速缓存设计思想 2.4 虚拟内存访问内存03.存储器类型3.1 按照材质划分 3.2 按芯片类型划分 3.3 内存 vs CPU 3.4 存储器访问权…

自动化生成测试报告(Jemeter)

点击查看代码 E:\apache-jmeter-5.6.3\work>E:\apache-jmeter-5.6.3\bin\jmeter -n -t 模块控制器.jmx -l report.jtl -o E:\apache-jmeter-5.6.3\report