CSharpEssentials.Resilience
3.2.3
dotnet add package CSharpEssentials.Resilience --version 3.2.3
NuGet\Install-Package CSharpEssentials.Resilience -Version 3.2.3
<PackageReference Include="CSharpEssentials.Resilience" Version="3.2.3" />
<PackageVersion Include="CSharpEssentials.Resilience" Version="3.2.3" />
<PackageReference Include="CSharpEssentials.Resilience" />
paket add CSharpEssentials.Resilience --version 3.2.3
#r "nuget: CSharpEssentials.Resilience, 3.2.3"
#:package CSharpEssentials.Resilience@3.2.3
#addin nuget:?package=CSharpEssentials.Resilience&version=3.2.3
#tool nuget:?package=CSharpEssentials.Resilience&version=3.2.3
CSharpEssentials.Resilience
HTTP-agnostic resilience patterns (Retry, Timeout, Circuit Breaker, Fallback) with Result<T> integration. Composable ResiliencePolicy builder backed by Polly v8 for transient fault handling without exceptions.
Installation
dotnet add package CSharpEssentials.Resilience
Quick Start
using CSharpEssentials.Resilience;
// Simple retry
Result<User> user = await ResiliencePolicy
.Create()
.WithRetry(maxAttempts: 3, delay: TimeSpan.FromSeconds(1))
.ExecuteAsync(_ => _db.GetUser(id));
// Retry + Timeout
Result<Order> order = await ResiliencePolicy
.Create()
.WithRetry(3)
.WithTimeout(TimeSpan.FromSeconds(5))
.ExecuteAsync(_ => _orderService.GetOrder(id));
// Circuit Breaker + Fallback
Result<Product> product = await ResiliencePolicy
.Create()
.WithCircuitBreaker(minimumThroughput: 10, failureRatio: 0.5)
.WithFallback(ct => _cache.GetAsync<Product>(id, ct))
.ExecuteAsync(_ => _productService.GetProduct(id));
Delegate Extensions
using CSharpEssentials.Resilience;
// Direct execution — wraps any Func<Task<T>> in a Result
Result<User> user = await (() => _db.GetUser(id)).ExecuteAsync();
// With CancellationToken
Result<User> user = await ((ct) => _db.GetUser(id, ct)).ExecuteAsync(cancellationToken);
Result Retry
// Retry a failed Result directly
Func<CancellationToken, Task<Result<User>>> operation = ct => _db.GetUser(id);
Result<User> result = await operation.RetryIfFailed(maxAttempts: 3, delay: TimeSpan.FromSeconds(1));
Configuration Options
using CSharpEssentials.Resilience;
// Use options records
var options = new ResiliencePolicyOptions
{
Retry = new RetryOptions { MaxAttempts = 3, Delay = TimeSpan.FromSeconds(1) },
Timeout = new TimeoutOptions { Timeout = TimeSpan.FromSeconds(5) },
CircuitBreaker = new CircuitBreakerOptions
{
MinimumThroughput = 10,
FailureRatio = 0.5,
BreakDuration = TimeSpan.FromSeconds(30)
}
};
Result<User> user = await ResiliencePolicy
.Create(options)
.ExecuteAsync(_ => _db.GetUser(id));
Error Handling
Resilience-specific errors are returned as Error values:
Error.Failure("Resilience.Timeout", "Operation timed out.")Error.Failure("Resilience.CircuitBroken", "Circuit breaker is open.")
When retries exhaust, the last exception is returned as ErrorType.Unexpected.
Pipeline Composition
// Stack multiple policies
Result<Data> result = await ResiliencePolicy
.Create()
.WithRetry(3)
.WithTimeout(TimeSpan.FromSeconds(5))
.WithCircuitBreaker(minimumThroughput: 10)
.ExecuteAsync(_ => _api.GetData());
Polly Integration
Under the hood, uses Polly v8 ResiliencePipeline:
// Advanced: Direct Polly configuration
Result<Data> result = await ResiliencePolicy
.Create(builder =>
{
builder.AddRetry(new RetryStrategyOptions
{
MaxRetryAttempts = 3,
Delay = TimeSpan.FromSeconds(1),
BackoffType = DelayBackoffType.Exponential
});
})
.ExecuteAsync(_ => _api.GetData());
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- CSharpEssentials.Errors (>= 3.2.3)
- CSharpEssentials.Results (>= 3.2.3)
- Polly (>= 8.0.0)
- System.Text.Json (>= 9.0.4)
-
net10.0
- CSharpEssentials.Errors (>= 3.2.3)
- CSharpEssentials.Results (>= 3.2.3)
- Polly (>= 8.0.0)
-
net11.0
- CSharpEssentials.Errors (>= 3.2.3)
- CSharpEssentials.Results (>= 3.2.3)
- Polly (>= 8.0.0)
-
net9.0
- CSharpEssentials.Errors (>= 3.2.3)
- CSharpEssentials.Results (>= 3.2.3)
- Polly (>= 8.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on CSharpEssentials.Resilience:
| Package | Downloads |
|---|---|
|
CSharpEssentials.Http
HttpClient extensions that bridge HTTP calls to the Result pattern. Provides GetFromJsonAsResultAsync, PostAsJsonAsResultAsync, status code mapping, and Polly resilience integration. |
GitHub repositories
This package is not used by any popular GitHub repositories.