我有一个调用外部api的查询IGetHamburgers
我已经在我的di容器中将IGetHamburgers的实现注册为单例。我使用波利作为断路器,如果两个请求失败,电路将打开。
我的目标是所有对hamburger api的调用都应该通过同一个断路器,如果gethamburgers失败了,那么所有其他的调用也应该失败。
我该如何使用我的保险单?我是否应将我的保险单注册为这样的字段:

private Policy _policy;

private Policy Policy
{
    get
    {
        if(this_policy != null)
        {
            return this_policy;
        }

        this._policy = Policy
            .Handle<Exception>()
            .CircuitBreaker(2, TimeSpan.FromMinutes(1));

        return this._policy;
    }
}

public object Execute(.......)
{
    return Policy.Execute(() => this.hamburgerQuery.GetHamburgers());
}

或者
public object Execute(.......)
{
    var breaker = Policy
            .Handle<Exception>()
            .CircuitBreaker(2, TimeSpan.FromMinutes(1));
    return breaker.Execute(() => this.hamburgerQuery.GetHamburgers());
}

我想第一个选项是正确的方法,因为从那时起,policy对象将始终是相同的,并且可以跟踪异常计数和类似的内容。
我的问题是,第二个选项也行吗?我在pollys github上找到了很多示例,但是我找不到任何“真实世界”的示例,其中polly与di一起使用,诸如此类?

最佳答案

我想第一个选项是正确的方法,因为从那时起,policy对象将始终是相同的,并且可以跟踪异常计数和类似的内容。
对的。这在polly wikihere中有描述。简言之:
当您希望这些呼叫站点共同中断时,在呼叫站点之间共享同一中断器策略实例-例如,它们具有共同的下游依赖项。
当您希望呼叫站点具有独立的电路状态并独立断开时,不要在呼叫站点之间共享断路器实例。
请参见this stackoverflow answer了解有关在polly策略的整个范围内(2017年6月)分别配置策略及其使用、通过di将策略注入使用站点以及重新使用同一实例(例如singleton)与使用单独实例的效果的更广泛的讨论。
第二种选择也行吗?
否(相反的原因是:每个调用创建一个单独的实例,因此不会与其他调用共享电路统计信息/状态)。

10-04 11:12