首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月01日 09:59

前言

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

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技术匠] 社区,与其他热爱技术的同行交流心得,共同成长。

From:https://www.cnblogs.com/1312mn/p/18336221
本文地址: http://www.shuzixingkong.net/article/658
0评论
提交 加载更多评论
其他文章 02.计算器存储器的原理
02.计算器存储器的原理 目录介绍 01.什么是存储器 1.1 了解存储器是什么 1.2 存储器类型 02.存储器系统设计 2.1 存储器分层设计 2.2 存储器层次结构 2.3 高速缓存设计思想 2.4 虚拟内存访问内存 03.存储器类型 3.1 按照材质划分 3.2 按芯片类型划分 3.3 内存
02.计算器存储器的原理
SemanticKernel/C#:检索增强生成(RAG)简易实践
检索增强生成(RAG)是什么? RAG是“Reference-based Generative model with Attention”的缩写,也可以被称为“Retrieval-Augmented Generation”,是一种结合了检索技术和生成模型的方法,主要用于自然语言处理任务,如文本生成、
SemanticKernel/C#:检索增强生成(RAG)简易实践 SemanticKernel/C#:检索增强生成(RAG)简易实践 SemanticKernel/C#:检索增强生成(RAG)简易实践
canvas实现截图功能
开篇 最近在做一个图片截图的功能。 因为工作时间很紧张, 当时是使用的是一个截图插件。 周末两天无所事事,来写一个简单版本的截图功能。 因为写的比较简单,如果写的不好,求大佬轻一点喷 读取图片并获取图片的宽度和高度思路 首先读取文件我们使用input中类型是file。 我们需要对读取的对象进行限制,
canvas实现截图功能 canvas实现截图功能 canvas实现截图功能
PHP转Go系列 | Carbon 时间处理工具的使用姿势
在日常的开发过程中经常会遇到对时间的处理,比如将时间戳进行格式化、获取昨天或上周或上个月的时间、基于当前时间进行加减等场景的使用
PHP转Go系列 | Carbon 时间处理工具的使用姿势
自从用了这些监控工具,我连续几天没睡好觉!
大家好,我是程序员鱼皮,今天分享一些很实用的系统监控告警工具。 为什么要用监控告警? 说到监控告警,没有企业开发经验的同学非常容易忽视它,甚至会有同学觉得没有必要,大不了出了 Bug 再修就是了。 这种想法大错特错! 我们把系统想象成人的身体。有的时候,一个人表面看起来可能很健康,但可能只是没有机会
自从用了这些监控工具,我连续几天没睡好觉! 自从用了这些监控工具,我连续几天没睡好觉! 自从用了这些监控工具,我连续几天没睡好觉!
telegraf 常用命令总结
本文为博主原创,转载请注明出处: Telegraf 是一个灵活的服务器代理,用于收集和报告指标。它支持插件驱动,这意味着你可以根据需要添加或修改功能。 1.使用telegraf --help 查看telegraf提供的相关命令和参数 使用telegraf --help 可以查看telegraf提供的
telegraf 常用命令总结
使用 useState 管理响应式状态
title: 使用 useState 管理响应式状态 date: 2024/8/1 updated: 2024/8/1 author: cmdragon excerpt: 摘要:本文详细介绍了在Nuxt3框架中使用useState进行响应式状态管理的方法,包括其基本概念、优势、使用方法、共享状态实现
使用 useState 管理响应式状态 使用 useState 管理响应式状态
稀土领域生产一体化管控系统建设案例
经过2个月的详细调研,**稀土目前缺少生产车间之间数据协同交互、缺少完整的生产工序数据协同监测和分析,无法及时了解生产过程和经营情况,更无法进行有效的生产过程优化。本项目推动**稀土生产环节的数字化、信息化和智能化改造,从行业、战略、技术和市场等方案全面提升**稀土的竞争力,打造**稀土焙烧、水浸、
稀土领域生产一体化管控系统建设案例 稀土领域生产一体化管控系统建设案例 稀土领域生产一体化管控系统建设案例