| 
21 | 21 |     options.SerializerOptions.NumberHandling = JsonNumberHandling.Strict;  | 
22 | 22 | });  | 
23 | 23 | 
 
  | 
 | 24 | +Func<HttpContext, OpenApiSpecVersion?> versionSelector = (context) =>  | 
 | 25 | +{  | 
 | 26 | +    if (context.Request.Query["version"] is { Count: 1 } version &&  | 
 | 27 | +        Enum.TryParse<OpenApiSpecVersion>(version, out var result))  | 
 | 28 | +    {  | 
 | 29 | +        return result;  | 
 | 30 | +    }  | 
 | 31 | + | 
 | 32 | +    return null;  | 
 | 33 | +};  | 
 | 34 | + | 
24 | 35 | builder.Services.AddOpenApi("v1", options =>  | 
25 | 36 | {  | 
 | 37 | +    options.OpenApiVersionSelector = versionSelector;  | 
26 | 38 |     options.AddHeader("X-Version", "1.0");  | 
27 | 39 |     options.AddDocumentTransformer<BearerSecuritySchemeTransformer>();  | 
28 | 40 | });  | 
29 | 41 | builder.Services.AddOpenApi("v2", options =>  | 
30 | 42 | {  | 
 | 43 | +    options.OpenApiVersionSelector = versionSelector;  | 
31 | 44 |     options.AddSchemaTransformer<AddExternalDocsTransformer>();  | 
32 | 45 |     options.AddOperationTransformer<AddExternalDocsTransformer>();  | 
33 | 46 |     options.AddDocumentTransformer(new AddContactTransformer());  | 
 | 
53 | 66 |     "xml",  | 
54 | 67 | };  | 
55 | 68 | 
 
  | 
56 |  | -foreach (var version in versions)  | 
 | 69 | +foreach (var name in documentNames)  | 
57 | 70 | {  | 
58 |  | -    builder.Services.AddOpenApi($"v1-{version}", options =>  | 
59 |  | -    {  | 
60 |  | -        options.OpenApiVersion = version;  | 
61 |  | -        options.ShouldInclude = (description) => description.GroupName == null || description.GroupName == "v1";  | 
62 |  | -        options.AddHeader("X-Version", "1.0");  | 
63 |  | -        options.AddDocumentTransformer<BearerSecuritySchemeTransformer>();  | 
64 |  | -    });  | 
65 |  | -    builder.Services.AddOpenApi($"v2-{version}", options =>  | 
66 |  | -    {  | 
67 |  | -        options.OpenApiVersion = version;  | 
68 |  | -        options.ShouldInclude = (description) => description.GroupName == null || description.GroupName == "v2";  | 
69 |  | -        options.AddSchemaTransformer<AddExternalDocsTransformer>();  | 
70 |  | -        options.AddOperationTransformer<AddExternalDocsTransformer>();  | 
71 |  | -        options.AddDocumentTransformer(new AddContactTransformer());  | 
72 |  | -        options.AddDocumentTransformer((document, context, token) =>  | 
73 |  | -        {  | 
74 |  | -            document.Info.License = new OpenApiLicense { Name = "MIT" };  | 
75 |  | -            return Task.CompletedTask;  | 
76 |  | -        });  | 
77 |  | -    });  | 
78 |  | - | 
79 |  | -    foreach (var name in documentNames)  | 
80 |  | -    {  | 
81 |  | -        builder.Services.AddOpenApi($"{name}-{version}", options =>  | 
82 |  | -        {  | 
83 |  | -            options.OpenApiVersion = version;  | 
84 |  | -            options.ShouldInclude = (description) => description.GroupName == null || description.GroupName == name;  | 
85 |  | -        });  | 
86 |  | -    }  | 
 | 71 | +    builder.Services.AddOpenApi(name, (options) => options.OpenApiVersionSelector = versionSelector);  | 
87 | 72 | }  | 
88 | 73 | 
 
  | 
89 | 74 | var app = builder.Build();  | 
 | 
0 commit comments