Skip to content

Commit be8a849

Browse files
Provide method to describe API versions for Minimal APIs.Relates to #812
1 parent dfcfb51 commit be8a849

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2+
3+
namespace Microsoft.AspNetCore.Builder;
4+
5+
using Asp.Versioning;
6+
using Asp.Versioning.ApiExplorer;
7+
using Microsoft.AspNetCore.Routing;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Options;
10+
11+
/// <summary>
12+
/// Provides extension methods for <see cref="IEndpointRouteBuilder"/>.
13+
/// </summary>
14+
[CLSCompliant( false )]
15+
public static class IEndpointRouteBuilderExtensions
16+
{
17+
/// <summary>
18+
/// Returns a read-only list of API version descriptions.
19+
/// </summary>
20+
/// <param name="endpoints">The <see cref="IEndpointRouteBuilder">endpoints</see> to build the
21+
/// API version descriptions from.</param>
22+
/// <returns>A new <see cref="IReadOnlyList{T}">read-only list</see> of<see cref="ApiVersionDescription">API version descriptions</see>.</returns>
23+
public static IReadOnlyList<ApiVersionDescription> DescribeApiVersions( this IEndpointRouteBuilder endpoints )
24+
{
25+
if ( endpoints == null )
26+
{
27+
throw new ArgumentNullException( nameof( endpoints ) );
28+
}
29+
30+
// this should be produced by IApiVersionDescriptionProvider via di; however, for minimal apis, the
31+
// endpoints in the registered EndpointDataSource may not have been built yet. this is important
32+
// for the api explorer extensions (ex: openapi). the following is the same setup that would occur
33+
// through via di, but the IEndpointRouteBuilder is expected to be the WebApplication used during
34+
// setup. unfortunately, the behavior cannot simply be changed by replacing IApiVersionDescriptionProvider
35+
// in the container for minimal apis, but that is not a common scenario. all the types and pieces
36+
// necessary to change this behavior is still possible outside of this method, but it's on the developer
37+
var source = new CompositeEndpointDataSource( endpoints.DataSources );
38+
var policyManager = endpoints.ServiceProvider.GetRequiredService<ISunsetPolicyManager>();
39+
var options = endpoints.ServiceProvider.GetRequiredService<IOptions<ApiExplorerOptions>>();
40+
var provider = new DefaultApiVersionDescriptionProvider( source, policyManager, options );
41+
42+
return provider.ApiVersionDescriptions;
43+
}
44+
}

0 commit comments

Comments
 (0)