Skip to content

Commit 91a056b

Browse files
committed
Updates
1 parent 35de349 commit 91a056b

File tree

7 files changed

+56
-33
lines changed

7 files changed

+56
-33
lines changed

src/BenchmarksApps/TodosApi/DataExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Data;
22
using System.Runtime.CompilerServices;
3+
using Microsoft.Extensions.Options;
4+
using TodosApi;
35

46
namespace Npgsql;
57

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Microsoft.Extensions.Options;
2+
using Npgsql;
3+
using TodosApi;
4+
5+
namespace Microsoft.Extensions.Hosting;
6+
7+
internal static class DatabaseConfiguration
8+
{
9+
public static IServiceCollection AddDatabase(this IServiceCollection services)
10+
{
11+
services.AddSingleton(static sp =>
12+
{
13+
var appSettings = sp.GetRequiredService<IOptions<AppSettings>>().Value;
14+
var db = appSettings.GeneratingOpenApiDoc
15+
? default!
16+
: new NpgsqlSlimDataSourceBuilder(appSettings.ConnectionString).Build();
17+
18+
return db;
19+
});
20+
services.AddHostedService<DatabaseInitializer>();
21+
return services;
22+
}
23+
}

src/BenchmarksApps/TodosApi/DatabaseInitializer.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,11 @@ internal class DatabaseInitializer : IHostedService
1111
private readonly ILogger<DatabaseInitializer> _logger;
1212
private readonly bool _initDatabase;
1313

14-
public DatabaseInitializer(NpgsqlDataSource db, IOptions<AppSettings> appSettings, IServer server, ILogger<DatabaseInitializer> logger)
14+
public DatabaseInitializer(NpgsqlDataSource db, IOptions<AppSettings> appSettings, ILogger<DatabaseInitializer> logger)
1515
{
1616
_db = db;
1717
_logger = logger;
18-
_initDatabase = !appSettings.Value.SuppressDbInitialization
19-
// Only run if this is an actual IServer implementation with addresses to listen on.
20-
// Will not be the case for TestServer, NoopServer injected by the OpenAPI doc generator tool, etc.
21-
&& server.Features.Get<IServerAddressesFeature>() is { Addresses.Count: >0 };
18+
_initDatabase = !appSettings.Value.SuppressDbInitialization && !appSettings.Value.GeneratingOpenApiDoc;
2219
}
2320

2421
public Task StartAsync(CancellationToken cancellationToken)
@@ -32,14 +29,12 @@ public Task StartAsync(CancellationToken cancellationToken)
3229
{
3330
_logger.LogInformation("Database initialization disabled for connection string '{connectionString}'", _db?.ConnectionString);
3431
}
35-
return Task.CompletedTask;
36-
}
3732

38-
public Task StopAsync(CancellationToken cancellationToken)
39-
{
4033
return Task.CompletedTask;
4134
}
4235

36+
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
37+
4338
private async Task Initialize(CancellationToken cancellationToken = default)
4439
{
4540
// NOTE: Npgsql removes the password from the connection string
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#if ENABLE_OPENAPI
2+
using Microsoft.OpenApi.Models;
3+
#endif
4+
5+
namespace Microsoft.Extensions.Hosting;
6+
7+
internal static class OpenApiExtensions
8+
{
9+
public static IServiceCollection AddOpenApi(this IServiceCollection services)
10+
{
11+
#if ENABLE_OPENAPI
12+
services.AddEndpointsApiExplorer();
13+
services.AddSwaggerGen(c =>
14+
{
15+
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Todos API", Version = "v1" });
16+
});
17+
#endif
18+
return services;
19+
}
20+
}

src/BenchmarksApps/TodosApi/Program.cs

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
using Microsoft.Extensions.Options;
2-
#if ENABLE_OPENAPI
3-
using Microsoft.OpenApi.Models;
4-
#endif
5-
using Npgsql;
61
using TodosApi;
72

83
var builder = WebApplication.CreateSlimBuilder(args);
@@ -20,14 +15,7 @@
2015
builder.Services.AddAuthorization();
2116

2217
// Configure data access
23-
builder.Services.AddSingleton(sp =>
24-
{
25-
var appSettings = sp.GetRequiredService<IOptions<AppSettings>>().Value;
26-
return appSettings.GeneratingOpenApiDoc
27-
? default!
28-
: new NpgsqlSlimDataSourceBuilder(appSettings.ConnectionString).Build();
29-
});
30-
builder.Services.AddHostedService<DatabaseInitializer>();
18+
builder.Services.AddDatabase();
3119

3220
// Configure JSON serialization
3321
builder.Services.ConfigureHttpJsonOptions(options =>
@@ -43,14 +31,8 @@
4331
// Problem details
4432
builder.Services.AddProblemDetails();
4533

46-
#if ENABLE_OPENAPI
47-
// Configure OpenAPI
48-
builder.Services.AddEndpointsApiExplorer();
49-
builder.Services.AddSwaggerGen(c =>
50-
{
51-
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Todos API", Version = "v1" });
52-
});
53-
#endif
34+
// OpenAPI
35+
builder.Services.AddOpenApi();
5436

5537
var app = builder.Build();
5638

@@ -59,8 +41,7 @@
5941
app.UseExceptionHandler();
6042
}
6143

62-
// Causes issue with native AOT currently: https://github.com/dotnet/aspnetcore/issues/47941
63-
//app.MapShortCircuit(StatusCodes.Status404NotFound, "/favicon.ico");
44+
app.MapShortCircuit(StatusCodes.Status404NotFound, "/favicon.ico");
6445

6546
app.MapHealthChecks("/health");
6647

src/BenchmarksApps/TodosApi/TodosApi.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.0-preview.*" />
2323
<PackageReference Include="Npgsql" Version="8.0.0-preview.3" />
2424
<Content Update="appSettings.Development.json" CopyToPublishDirectory="false" />
25+
<!-- Workaround for https://github.com/dotnet/aspnetcore/issues/47941 -->
26+
<IlcArg Include="--nopreinitstatics" />
2527
</ItemGroup>
2628

2729
<PropertyGroup Condition=" '$(EnableOpenApi)' == 'true' ">

src/BenchmarksApps/TodosApi/TodosApi.http

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@TodosApi_HostAddress = http://localhost:5054
22
# Uncomment following line if sending requests to published app
3-
#@TodosApi_HostAddress = http://localhost:5000
3+
@TodosApi_HostAddress = http://localhost:5000
44

55
# For more info on HTTP files go to https://aka.ms/vs/httpfile
66

0 commit comments

Comments
 (0)