前言
當我們要為某段程式碼設定執行錯誤時,讓它 Retry 可以很簡單的建立一個 Retry 的擴充方法來達到,如下,
1 | static class HOFs |
例如取得網頁內容的 Function 後面再加上 WithRetry(次數),如下,
1 | Func<string> download = () => |
那如果 url 要在呼叫時再給呢? 要怎麼辦呢?
解法
因為要多一個參數,所以 download
由 Func<string>
要改成 Func<string, string>
,如下,
1 | var url = "https://www.gss.com.tw"; |
但因為 WithRetry
接受的是 Func<string>
,
所以我們有 2 個方式,
1.Partial : 將輸入參數轉由 Partial
接收,傳出 WithRetry
需要的 Func<string>
以我們的例子,接收的是 Func<string, string>
透過 Partial
執行後回傳 Func<string>
,
參數則由 Partial 的 TParam1 傳給 download,
1 | public static Func<TResult> Partial<TParam1, TResult>( |
所以程式可以改成以下,
1 | var url = "https://www.gss.com.tw"; |
2.Curry : 將分解輸入參數,回傳輸入參數及 WithRetry
需要的 Func<string>
download 是 Func<string, string>
,所以傳回 Func<string, Func<string>>
1 | public static Func<TParam1, Func<TResult>> Curry<TParam1, TResult>( |
所以程式可以改成以下,
1 | var url = "https://www.gss.com.tw"; |
以上透過 WithRetry 來測試裡面 Method 參數改變時,
要如何透過 Partail
or Curry
來傳回 WithRetry
所需要的 Func,
讓我們更了解 Func
的用法。
如果要快速使用 Retry 可直接使用 Polly
參考資源
Implement HTTP call retries with exponential backoff with IHttpClientFactory and Polly policies
Polly