Skip to content

Commit f1e56be

Browse files
Optimize DI resolution
1 parent d4927a5 commit f1e56be

File tree

2 files changed

+21
-11
lines changed

2 files changed

+21
-11
lines changed

src/AspNetCore/WebApi/src/Asp.Versioning.Mvc.ApiExplorer/ApiVersionDescriptionProviderFactory.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,30 @@ namespace Microsoft.AspNetCore.Builder;
1010

1111
internal sealed class ApiVersionDescriptionProviderFactory : IApiVersionDescriptionProviderFactory
1212
{
13-
private readonly IServiceProvider serviceProvider;
13+
private readonly ISunsetPolicyManager sunsetPolicyManager;
14+
private readonly IApiVersionMetadataCollationProvider[] providers;
15+
private readonly IOptions<ApiExplorerOptions> options;
1416
private readonly Func<IEnumerable<IApiVersionMetadataCollationProvider>, ISunsetPolicyManager, IOptions<ApiExplorerOptions>, IApiVersionDescriptionProvider> activator;
1517

1618
public ApiVersionDescriptionProviderFactory(
17-
IServiceProvider serviceProvider,
18-
Func<IEnumerable<IApiVersionMetadataCollationProvider>, ISunsetPolicyManager, IOptions<ApiExplorerOptions>, IApiVersionDescriptionProvider> activator )
19+
Func<IEnumerable<IApiVersionMetadataCollationProvider>, ISunsetPolicyManager, IOptions<ApiExplorerOptions>, IApiVersionDescriptionProvider> activator,
20+
ISunsetPolicyManager sunsetPolicyManager,
21+
IEnumerable<IApiVersionMetadataCollationProvider> providers,
22+
IOptions<ApiExplorerOptions> options )
1923
{
20-
this.serviceProvider = serviceProvider;
2124
this.activator = activator;
25+
this.sunsetPolicyManager = sunsetPolicyManager;
26+
this.providers = providers.ToArray();
27+
this.options = options;
2228
}
2329

2430
public IApiVersionDescriptionProvider Create( EndpointDataSource endpointDataSource )
2531
{
26-
var providers = serviceProvider.GetServices<IApiVersionMetadataCollationProvider>().ToList();
32+
var collators = new List<IApiVersionMetadataCollationProvider>( capacity: providers.Length + 1 );
2733

28-
providers.Insert( 0, new EndpointApiVersionMetadataCollationProvider( endpointDataSource ) );
34+
collators.Add( new EndpointApiVersionMetadataCollationProvider( endpointDataSource ) );
35+
collators.AddRange( providers );
2936

30-
var sunsetPolicyManager = serviceProvider.GetRequiredService<ISunsetPolicyManager>();
31-
var options = serviceProvider.GetRequiredService<IOptions<ApiExplorerOptions>>();
32-
33-
return activator( providers, sunsetPolicyManager, options );
37+
return activator( collators, sunsetPolicyManager, options );
3438
}
3539
}

src/AspNetCore/WebApi/src/Asp.Versioning.Mvc.ApiExplorer/DependencyInjection/IApiVersioningBuilderExtensions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,16 @@ private static void AddApiExplorerServices( IApiVersioningBuilder builder )
7777

7878
private static IApiVersionDescriptionProviderFactory ResolveApiVersionDescriptionProviderFactory( IServiceProvider serviceProvider )
7979
{
80+
var sunsetPolicyManager = serviceProvider.GetRequiredService<ISunsetPolicyManager>();
81+
var providers = serviceProvider.GetServices<IApiVersionMetadataCollationProvider>();
8082
var options = serviceProvider.GetRequiredService<IOptions<ApiExplorerOptions>>();
8183
var mightUseCustomGroups = options.Value.FormatGroupName is not null;
8284

83-
return new ApiVersionDescriptionProviderFactory( serviceProvider, mightUseCustomGroups ? NewGroupedProvider : NewDefaultProvider );
85+
return new ApiVersionDescriptionProviderFactory(
86+
mightUseCustomGroups ? NewGroupedProvider : NewDefaultProvider,
87+
sunsetPolicyManager,
88+
providers,
89+
options );
8490

8591
static IApiVersionDescriptionProvider NewDefaultProvider(
8692
IEnumerable<IApiVersionMetadataCollationProvider> providers,

0 commit comments

Comments
 (0)