媒介
在项目开发中,方法返回的结果(成功或失败)对我们开发来说很重要。传统方法,如通过异常来指示错误或使用特定的返回类型(如布尔值加输出参数),固然有效,但大概缺乏直观性和灵活性。
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
假如觉得这篇文章对你有效,欢迎加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的偕行交换心得,共同成长。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |