<span class="token keyword keyword-using">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Net</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Microsoft<span class="token punctuation">.</span>Extensions<span class="token punctuation">.</span>DependencyInjection</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Microsoft<span class="token punctuation">.</span>Extensions<span class="token punctuation">.</span>Hosting</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Polly</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Polly<span class="token punctuation">.</span>CircuitBreaker</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Refit</span><span class="token punctuation">;</span>
<span class="token class-name"><span class="token keyword keyword-var">var</span></span> builder <span class="token operator">=</span> Host<span class="token punctuation">.</span><span class="token function">CreateApplicationBuilder</span><span class="token punctuation">(</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Register the Refit Client with a Circuit Breaker Pipeline</span>
builder<span class="token punctuation">.</span>Services<span class="token punctuation">.</span><span class="token generic-method"><span class="token function">AddRefitClient</span><span class="token generic class-name"><span class="token punctuation"><</span>IPaymentApi<span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">ConfigureHttpClient</span><span class="token punctuation">(</span>client <span class="token operator">=></span>
<span class="token punctuation">{</span>
client<span class="token punctuation">.</span>BaseAddress <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span class="token constructor-invocation class-name">Uri</span><span class="token punctuation">(</span><span class="token string">"https://api.paymentservice.com"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
client<span class="token punctuation">.</span>Timeout <span class="token operator">=</span> TimeSpan<span class="token punctuation">.</span><span class="token function">FromSeconds</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">AddResilienceHandler</span><span class="token punctuation">(</span><span class="token string">"RefitPaymentCircuitBreaker"</span><span class="token punctuation">,</span> resilienceBuilder <span class="token operator">=></span>
<span class="token punctuation">{</span>
resilienceBuilder<span class="token punctuation">.</span><span class="token function">AddCircuitBreaker</span><span class="token punctuation">(</span><span class="token keyword keyword-new">new</span> <span class="token constructor-invocation class-name">HttpCircuitBreakerStrategyOptions</span>
<span class="token punctuation">{</span>
<span class="token comment">// Open the circuit if 50% or more calls fail in the sampling window</span>
FailureRatio <span class="token operator">=</span> <span class="token number">0.5</span><span class="token punctuation">,</span>
<span class="token comment">// Minimum throughput required in the window before rules apply</span>
MinimumThroughput <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">,</span>
<span class="token comment">// Time window over which failure rate is calculated</span>
SamplingDuration <span class="token operator">=</span> TimeSpan<span class="token punctuation">.</span><span class="token function">FromSeconds</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">// Time the circuit stays OPEN before entering HALF-OPEN state</span>
BreakDuration <span class="token operator">=</span> TimeSpan<span class="token punctuation">.</span><span class="token function">FromSeconds</span><span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">// Define what errors trigger the circuit breaker</span>
ShouldHandle <span class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span class="token constructor-invocation class-name">HttpResiliencePredicateBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">HandleStatusCode</span><span class="token punctuation">(</span>HttpStatusCode<span class="token punctuation">.</span>InternalServerError<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">HandleStatusCode</span><span class="token punctuation">(</span>HttpStatusCode<span class="token punctuation">.</span>ServiceUnavailable<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">HandleStatusCode</span><span class="token punctuation">(</span>HttpStatusCode<span class="token punctuation">.</span>RequestTimeout<span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">Build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">// Monitoring and Observability Callbacks</span>
OnOpened <span class="token operator">=</span> args <span class="token operator">=></span>
<span class="token punctuation">{</span>
Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token interpolation-string"><span class="token string">$"[CIRCUIT OPEN] Payment API unreachable. Short-circuiting traffic for </span><span class="token interpolation"><span class="token punctuation">{</span><span class="token expression language-csharp">args<span class="token punctuation">.</span>BreakDuration<span class="token punctuation">.</span>TotalSeconds</span><span class="token punctuation">}</span></span><span class="token string">s."</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-return">return</span> ValueTask<span class="token punctuation">.</span>CompletedTask<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
OnClosed <span class="token operator">=</span> args <span class="token operator">=></span>
<span class="token punctuation">{</span>
Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"[CIRCUIT CLOSED] Payment API recovered. Resuming normal operations."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-return">return</span> ValueTask<span class="token punctuation">.</span>CompletedTask<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
OnHalfOpened <span class="token operator">=</span> args <span class="token operator">=></span>
<span class="token punctuation">{</span>
Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span><span class="token string">"[CIRCUIT HALF-OPEN] Sending trial requests to verify recovery..."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-return">return</span> ValueTask<span class="token punctuation">.</span>CompletedTask<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>