Дизайн, указанный в вопросе, соответствует требованию: поддерживать отдельный экземпляр политики автоматического выключателя для каждой нижестоящей системы, которую вы хотите рассматривать как имеющую отдельный статус работоспособности.
Polly не предлагает автоматический выключатель, который поддерживает большой внутренний словарь состояний работоспособности для каждого ключа.
Polly предлагает PolicyRegistry
; по сути, это словарь ключевой политики, аналогичный описанному в вопросе.
Если политика прерывателя цепи требуется для использования в середине политики, и это единственная вещь в политике, которая должна варьироваться для каждого арендатора, вы можете использовать 'селектор политик' внутри PolicyWrap для выбора или создания подходящей политики во время выполнения.
Пример кода по ссылке выше:
public class AsyncPolicySelector<TResult> : AsyncPolicy<TResult>
{
private readonly Func<Context, IAsyncPolicy<TResult>> policySelector;
public static AsyncPolicySelector<TResult> Create(Func<Context, IAsyncPolicy<TResult>> policySelector)
{
return new AsyncPolicySelector<TResult>(policySelector);
}
private AsyncPolicySelector(Func<Context, IAsyncPolicy<TResult>> policySelector)
{
this.policySelector = policySelector;
}
protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
return policySelector(context).ExecuteAsync(action, context, cancellationToken, continueOnCapturedContext);
}
}
создает пользовательскую AsyncPolicySelector<TResult>
политику, используя Func<Context, IAsyncPolicy<TResult>> policySelector
, которая может выбрать предыдущую или создать новую (при необходимости) политику.
Polly Context
имеет словарную семантику чтобы вы могли установить идентификатор арендатора на Context
перед выполнением.
Context context = new Context();
context["TenantId"] = /* tenant id from somewhere */
// (you must execute through the PolicyWrap then with an overload passing in this context)
И используйте Func<Context, IAsyncPolicy<TResult>> policySelector
, чтобы получить автоматический выключатель с помощью context["TenantId"]
из вашего словаря или PolicyRegistry
; или изготовьте новый автоматический выключатель для этого арендатора, если его еще не было.
person
mountain traveller
schedule
01.03.2019