Skip to content

Commit 6371c3a

Browse files
updated namespaces and versioning
1 parent 26193a4 commit 6371c3a

File tree

5 files changed

+66
-31
lines changed

5 files changed

+66
-31
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.AspNetCore.Mvc.ApiExplorer;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.Options;
4+
using Microsoft.OpenApi.Models;
5+
using Swashbuckle.AspNetCore.SwaggerGen;
6+
7+
namespace SampleWebApiAspNetCore
8+
{
9+
public class ConfigureSwaggerOptions : IConfigureOptions<SwaggerGenOptions>
10+
{
11+
readonly IApiVersionDescriptionProvider provider;
12+
13+
public ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider) => this.provider = provider;
14+
15+
public void Configure(SwaggerGenOptions options)
16+
{
17+
foreach (var description in provider.ApiVersionDescriptions)
18+
{
19+
options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description));
20+
}
21+
}
22+
23+
static OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription description)
24+
{
25+
var info = new OpenApiInfo()
26+
{
27+
Title = "Sample API",
28+
Version = description.ApiVersion.ToString(),
29+
Description = "A sample application with Swagger, Swashbuckle, and API versioning.",
30+
};
31+
32+
if (description.IsDeprecated)
33+
{
34+
info.Description += " This API version has been deprecated.";
35+
}
36+
37+
return info;
38+
}
39+
}
40+
}

SampleWebApiAspNetCore/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using SampleWebApiAspNetCore.Services;
88
using System;
99

10-
namespace WebApplication11
10+
namespace SampleWebApiAspNetCore
1111
{
1212
public class Program
1313
{

SampleWebApiAspNetCore/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"ASPNETCORE_ENVIRONMENT": "Development"
1818
}
1919
},
20-
"WebApplication11": {
20+
"SampleWebApiAspNetCore": {
2121
"commandName": "Project",
2222
"launchBrowser": true,
2323
"launchUrl": "swagger",

SampleWebApiAspNetCore/Repositories/EfFoodRepository.cs renamed to SampleWebApiAspNetCore/Repositories/FoodSqlRepository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
namespace SampleWebApiAspNetCore.Repositories
1010
{
11-
public class EfFoodRepository : IFoodRepository
11+
public class FoodSqlRepository : IFoodRepository
1212
{
1313
private readonly FoodDbContext _foodDbContext;
1414

15-
public EfFoodRepository(FoodDbContext foodDbContext)
15+
public FoodSqlRepository(FoodDbContext foodDbContext)
1616
{
1717
_foodDbContext = foodDbContext;
1818
}

SampleWebApiAspNetCore/Startup.cs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
using Microsoft.Extensions.DependencyInjection;
1414
using Microsoft.Extensions.Hosting;
1515
using Microsoft.Extensions.Logging;
16+
using Microsoft.Extensions.Options;
1617
using Microsoft.OpenApi.Models;
1718
using SampleWebApiAspNetCore.MappingProfiles;
1819
using SampleWebApiAspNetCore.Repositories;
1920
using SampleWebApiAspNetCore.Services;
21+
using Swashbuckle.AspNetCore.SwaggerGen;
2022

21-
namespace WebApplication11
23+
namespace SampleWebApiAspNetCore
2224
{
2325
public class Startup
2426
{
@@ -47,7 +49,7 @@ public void ConfigureServices(IServiceCollection services)
4749
});
4850

4951
services.AddSingleton<ISeedDataService, SeedDataService>();
50-
services.AddScoped<IFoodRepository, EfFoodRepository>();
52+
services.AddScoped<IFoodRepository, FoodSqlRepository>();
5153
services.AddRouting(options => options.LowercaseUrls = true);
5254
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
5355
services.AddScoped<IUrlHelper>(x =>
@@ -62,32 +64,25 @@ public void ConfigureServices(IServiceCollection services)
6264
.AddNewtonsoftJson()
6365
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
6466

65-
services.AddApiVersioning(config =>
66-
{
67-
config.ReportApiVersions = true;
68-
config.AssumeDefaultVersionWhenUnspecified = true;
69-
config.DefaultApiVersion = new ApiVersion(1, 0);
70-
config.ApiVersionReader = new HeaderApiVersionReader("api-version");
71-
});
72-
73-
services.AddVersionedApiExplorer(o => o.GroupNameFormat = "'v'VVV");
74-
services.AddSwaggerGen(
75-
options =>
76-
{
77-
ServiceProvider serviceProvider = services.BuildServiceProvider();
78-
var provider = serviceProvider.GetRequiredService<IApiVersionDescriptionProvider>();
67+
services.AddApiVersioning(
68+
config =>
69+
{
70+
config.ReportApiVersions = true;
71+
config.AssumeDefaultVersionWhenUnspecified = true;
72+
config.DefaultApiVersion = new ApiVersion(1, 0);
73+
config.ApiVersionReader = new HeaderApiVersionReader("api-version");
74+
});
75+
services.AddVersionedApiExplorer(
76+
options =>
77+
{
78+
options.GroupNameFormat = "'v'VVV";
7979

80-
foreach (var description in provider.ApiVersionDescriptions)
81-
{
82-
options.SwaggerDoc(
83-
description.GroupName,
84-
new OpenApiInfo()
85-
{
86-
Title = $"Sample API {description.ApiVersion}",
87-
Version = description.ApiVersion.ToString()
88-
});
89-
}
90-
});
80+
// note: this option is only necessary when versioning by url segment. the SubstitutionFormat
81+
// can also be used to control the format of the API version in route templates
82+
options.SubstituteApiVersionInUrl = true;
83+
});
84+
services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
85+
services.AddSwaggerGen();
9186

9287
services.AddAutoMapper(typeof(FoodMappings));
9388
}

0 commit comments

Comments
 (0)