Свойство CircuitState
доступно на интерфейсе ICircuitBreaker
, выполняемом экземпляром политики: (подробнее в Polly readme и wiki )
CircuitState state = breaker.CircuitState;
/*
CircuitState.Closed
CircuitState.Open
CircuitState.HalfOpen
CircuitState.Isolated
*/
где breaker
- это экземпляр политики, ie политика, первоначально возвращенная вашим методом GetCircuitBreakerPolicy()
.
Вы можете передать эту политику выключателя в контроллер через DI. Во время запуска вы можете сделать что-то вроде:
var breaker = GetCircuitBreakerPolicy();
services.AddSingleton<ICircuitBreakerPolicy<HttpResponseMessage>>(breaker as ICircuitBreakerPolicy<HttpResponseMessage>);
Конечно, вам нужно будет использовать этот тот же единственный экземпляр breaker
при вызове .AddPolicyHandler(...)
, а не создавать новый / другой.
builder.AddPolicyHandler(GetRetryPolicy().WrapAsync(breaker));
Затем контроллер может получить копию экземпляра выключателя путем инжекции в конструктор:
public class MyController
{
public MyController(ICircuitBreakerPolicy<HttpResponseMessage> breaker, /* etc */)
{
}
}
Передача выключателя в контроллер путем регистрации ICircuitBreakerPolicy<HttpResponseMessage>
на Контейнер DI (как показано выше) хорошо работает, если приложение использует только один экземпляр выключателя.
Если у вас есть несколько экземпляров политики выключателя, которые должны быть непосредственно доступны в других местах приложения, например, контроллерами, сохраните их в PolicyRegistry
и передайте IReadOnlyPolicyRegistry<string>
к контроллеру по DI. Существуют .AddPolicyHandlerFromRegistry()
перегрузок для настройки HttpClient
с политиками из PolicyRegistry
.