首页 > 其他分享 >.NET 结果FluentResults

.NET 结果FluentResults

时间:2024-08-04 09:19:08浏览次数:14  
标签:return FluentResults 结果 result NET public string Result

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

  合集 - .NET 开源工具(1)   1..NET 结果与错误处理利器 FluentResults08-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;  
​
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 类型并不直接提供 OnSuccess 和 OnFailure 这样的链式方法,因为这些方法可能是在 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 表达式中使用局部变量。
复制代码

运行结果

 

在这个示例中定义了两个扩展方法 OnSuccess 和 OnFailure,它们分别接受成功和失败时要执行的回调函数。这些方法首先检查 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

标签:return,FluentResults,结果,result,NET,public,string,Result
From: https://www.cnblogs.com/Leo_wl/p/18341453

相关文章

  • dotnet hello world
    参考资料dotnet命令参考使用dotnettest和xUnit在.NET中对C#进行单元测试DeclaringInternalsVisibleTointhecsprojXUnit输出消息创建控制台项目#创建项目目录mdDotnetStudycdDotnetStudy#创建解决方案dotnetnewsln#创建控制台项目,-n:名称,--use......
  • 跟《经济学人》学英文:2024年07月27日这期 AI firms will soon exhaust most of the in
    AIfirmswillsoonexhaustmostoftheinternet’sdataCantheycreatemore?原文:In2006fei-feili,thenattheUniversityofIllinois,nowatStanfordUniversity,sawhowminingtheinternetmighthelptotransformAIresearch.Linguisticresearch......
  • Aspose.Slides.NET 19.2 解析ppt内容保存svg 保存ppt内部图片
    //LoadPowerPointpresentationPresentationpresentation=newPresentation("D:\\work\\code\\demo\\WPFPPT\\test.ppt");varslide=presentation.Slides[3];//SaveslideasSVGvarstream=newFileStream(@"D:\图像{0}.svg",......
  • netmq测试
    说明:经对最新版本4.0.1.13测试。请示/响应和推拉模式都是并行的,哪个先传输完成先响应发布订阅时好像不支持中文topic,没仔细测试网上有说发布订阅是在客户端处理,在客户端判断是否符合,会有大量无效流量,经测试并非如此,如果不是本地订阅的topic则不会传输到本客户端。Pub......
  • 请解释一下这段代码会得到重复的结果
    我还在学习Python..我有一个Python代码,用于从网页中提取文本,但我仍然不能正确理解它fromurllib.requestimporturlopenfrombs4importBeautifulSoupurl="https://google.com"html=urlopen(url).read()soup=BeautifulSoup(html,features="html.parser")#kill......
  • 使用 Alba 对 AspnetCore项目进行测试
    前言在AspnetCore生态系统中,我们测试项目一般使用Microsoft.AspNetCore.TestHost的TestServer到.NET6后提供的Microsoft.AspNetCore.Mvc.Testing的WebApplicationFactory,后者是前者的封装,专门用于测试ASP.NETCore应用程序。它简化了创建和配置测试服务器的过程。而Alba也......
  • SourceGenerator 生成db to class代码优化结果记录 二
    优化在上一篇留下的DapperAOT还有什么特别优化点的问题在仔细阅读生成代码和源码之后,终于得到了答案个人之前一直以为DapperAOT只用了迭代器去实现,所以理应差不多实现代码却又极大差距,思维陷入了僵局,一度以为有什么黑魔法结果DapperAOT没有用迭代器去实现!!!靠北......
  • 【Linux或者Windows中相关网络工具使用介绍】nc、ping、ifconfig、ipaddr、tcpdump、l
    在实际的网络排错、运维诊断、或者是开发过程中,熟练运用Linux或者Windows当中的有关网络工具,能够助力我们更迅速更精准地定位故障。因而,今天给大家分享几款必掌握的网络利器。1.nc命令在Linux中,nc命令即netcat命令,它被称为网络工具中的“瑞士军刀”,是一个功能强大的......
  • 【K8s】专题八:Kubernetes 服务调度详解
    以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、订阅、转发!欢迎扫码关注个人公众号!目录一、基本介绍二、工作原理三、节点绑定四、亲和性调度1、亲和性类型2、亲和性规则3、NodeAffinity4、PodAffinity五、反亲和性调度1、反......
  • 区块链入门基础课:《Nethereum教程》零基础玩转以太坊开发(三)合约状态
    今天我们要讨论的是如何与智能合约进行交互,获取合约状态。下面的示例将会详细讲解如何与合约进行交互,及一些概念性的解释,有需要的朋友们可以收藏一下。一:概念解释在下面示例之前呢,我先解释下为什么需要调用合约状态,以及合约状态对开发而言有什么作用。实时的了解合约状......