前言 在項目開發中,方法返回的結果(成功或失敗)對我們開發來說很重要。傳統方法,如通過異常來指示錯誤或使用特定的返回類型(如布爾值加輸出參數),雖然有效,但可能缺乏直觀性和靈活性。 FluentResults庫應運而生,它以一種既流暢又富有表達力的方式,極大地優化了這一過程。通過使用FluentRe ...
在項目開發中,方法返回的結果(成功或失敗)對我們開發來說很重要。傳統方法,如通過異常來指示錯誤或使用特定的返回類型(如布爾值加輸出參數),雖然有效,但可能缺乏直觀性和靈活性。
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 本身的 Resu
lt
類型並不直接提供 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 提供了豐富的 API,可以靈活使用,與現有的 .NET 代碼庫和框架集成,如 ASP.NET Core、Entity Framework 等,還可以與其他第三方庫一起使用,以提供更全面的錯誤處理和結果功能。
如果你的項目中需要一種更好的方式來處理結果,並希望提高代碼的可讀性和可維護性,那麼 FluentResults 是一個不錯的選擇。
開源地址
如果覺得這篇文章對你有用,歡迎加入微信公眾號 [DotNet技術匠] 社區,與其他熱愛技術的同行交流心得,共同成長。