欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

.NET 結果與錯誤處理利器 FluentResults

freeflydom
2024年8月2日 15:42 本文熱度 1120

前言

在項目開發中,方法返回的結果(成功或失敗)對我們開發來說很重要。傳統方法,如通過異常來指示錯誤或使用特定的返回類型(如布爾值加輸出參數),雖然有效,但可能缺乏直觀性和靈活性。

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


轉自https://www.cnblogs.com/1312mn/p/18336221



該文章在 2024/8/2 15:42:51 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved