0

我正在开发带有 Polly 重试和断路器的 Azure Function App .net core 3.1。到目前为止,我使用构建器将详细信息记录到 App Insights 没有问题,因为它在执行如下所示之前不会被初始化

    private static void AddPoliciesAsync(this IHttpClientBuilder builder)
    {
        builder.AddPolicyHandler((service, request) =>
        GetRetryAsyncPolicy(service.GetService<ILogger<HTTPTrigger1>>()).WrapAsync(
        GetCircuitBreakerAsyncPolicy(service.GetService<ILogger<HTTPTrigger1>>())));
    }

其中 HTTPTrigger1 是用于测试的函数应用名称。现在我需要扩展现有的功能来检查电路是否损坏,以便我可以运行另一组业务功能。对于这里提到的https://github.com/App-vNext/Polly#circuit-breaker,我添加了 CB 的单例实例以确保正在读取断路器状态。

        var logger = services.BuildServiceProvider().GetService<ILogger<HTTPTrigger1>>();
        var circuitBreaker = GetCircuitBreakerAsyncPolicy(logger);
        services.AddSingleton(circuitBreaker as ICircuitBreakerPolicy<HttpResponseMessage>);
        services.AddHttpClient("name", client =>
        {
            // something
        })
        .AddPollyPolicies(logger, circuitBreaker);

但是在第二个实现中获取记录器实例时出现错误。正如我在 MS 文档中检查的那样https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#caveats说不要在启动期间记录消息,即使我正在创建例如,它仍然会引发错误(后续调用所需的实习生)。无论如何我可以在这里实现日志记录吗?

4

1 回答 1

0

为什么不直接使用AddSingleton工厂重载?

services.AddSingleton(sp => {
    var logger = sp.GetService<ILogger<HTTPTrigger1>>();
    var circuitBreaker = GetCircuitBreakerAsyncPolicy(logger);
    return circuitBreaker as ICircuitBreakerPolicy<HttpResponseMessage>;
});
于 2020-04-02T14:23:37.130 回答