diff --git a/eng/Versions.props b/eng/Versions.props
index 7f1671a8e6d3..82a5d7de7ea9 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -246,7 +246,7 @@
13.0.4
0.192.0
3.0.0
- 7.1.0
+ 7.2.2
4.0.0-beta1
89.0.4389.2300-beta
4.0.0-beta1
diff --git a/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs b/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs
index 6fe049d11724..c9e080c4faf9 100644
--- a/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs
+++ b/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
@@ -8,15 +8,15 @@
namespace Microsoft.Extensions.DependencyInjection
{
///
- /// Provides convenience extension methods to register and
- /// in the service collection.
+ /// Provides convenience extension methods to register and
+ /// in the service collection.
///
public static class PollyServiceCollectionExtensions
{
///
/// Registers an empty in the service collection with service types
- /// , and and returns
- /// the newly created registry.
+ /// , , and
+ /// and returns the newly created registry.
///
/// The .
/// The newly created .
@@ -30,6 +30,8 @@ public static IPolicyRegistry AddPolicyRegistry(this IServiceCollection
// Create an empty registry, register and return it as an instance. This is the best way to get a
// single instance registered using both interfaces.
var registry = new PolicyRegistry();
+
+ services.AddSingleton>(registry);
services.AddSingleton>(registry);
services.AddSingleton>(registry);
@@ -38,8 +40,8 @@ public static IPolicyRegistry AddPolicyRegistry(this IServiceCollection
///
/// Registers the provided in the service collection with service types
- /// , and and returns
- /// the provided registry.
+ /// , , and
+ /// and returns the provided registry.
///
/// The .
/// The .
@@ -59,13 +61,18 @@ public static IPolicyRegistry AddPolicyRegistry(this IServiceCollection
services.AddSingleton>(registry);
services.AddSingleton>(registry);
+ if (registry is IConcurrentPolicyRegistry concurrentRegistry)
+ {
+ services.AddSingleton>(concurrentRegistry);
+ }
+
return registry;
}
///
/// Registers an empty in the service collection with service types
- /// , and and
- /// uses the specified delegate to configure it.
+ /// , , and
+ /// and uses the specified delegate to configure it.
///
/// The .
/// A delegate that is used to configure an .
@@ -93,6 +100,7 @@ public static IServiceCollection AddPolicyRegistry(this IServiceCollection servi
return registry;
});
+ services.AddSingleton>(serviceProvider => serviceProvider.GetRequiredService());
services.AddSingleton>(serviceProvider => serviceProvider.GetRequiredService());
services.AddSingleton>(serviceProvider => serviceProvider.GetRequiredService());
diff --git a/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs b/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs
index 94d3f82bfdf2..0f30410379de 100644
--- a/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs
+++ b/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs
@@ -11,6 +11,7 @@
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Http.Logging;
using Polly;
+using Polly.Registry;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
@@ -468,6 +469,60 @@ public async Task AddPolicyHandlerFromRegistry_WithConfigureDelegate_AddsPolicyH
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
}
+ [Fact]
+ public void AddPolicyHandlerFromRegistry_WithoutConfigureDelegate_AddsPolicyRegistries()
+ {
+ var serviceCollection = new ServiceCollection();
+
+ // Act
+ serviceCollection.AddPolicyRegistry();
+
+ var services = serviceCollection.BuildServiceProvider();
+ var registry = services.GetService>();
+
+ // Assert
+ Assert.NotNull(registry);
+ Assert.Same(registry, services.GetService>());
+ Assert.Same(registry, services.GetService>());
+ }
+
+ [Fact]
+ public void AddPolicyHandlerFromRegistry_WithRegistry_AddsPolicyRegistries()
+ {
+ var serviceCollection = new ServiceCollection();
+ var registry = new PolicyRegistry();
+
+ // Act
+ serviceCollection.AddPolicyRegistry(registry);
+
+ var services = serviceCollection.BuildServiceProvider();
+
+ // Assert
+ Assert.Same(registry, services.GetService>());
+ Assert.Same(registry, services.GetService>());
+ Assert.Same(registry, services.GetService>());
+ }
+
+ [Fact]
+ public void AddPolicyHandlerFromRegistry_WithConfigureDelegate_AddsPolicyRegistries()
+ {
+ var serviceCollection = new ServiceCollection();
+
+ // Act
+ serviceCollection.AddPolicyRegistry((serviceProvider, registry) =>
+ {
+ // No-op
+ });
+
+ var services = serviceCollection.BuildServiceProvider();
+ var registry = services.GetService>();
+
+ // Assert
+ Assert.NotNull(registry);
+ Assert.Same(registry, services.GetService>());
+ Assert.Same(registry, services.GetService>());
+ }
+
// Throws an exception or fails on even numbered requests, otherwise succeeds.
private class FaultyMessageHandler : DelegatingHandler
{