Skip to content

Commit 1aa2e29

Browse files
committed
Application setup logic as separate extension methods
1 parent 2121b6f commit 1aa2e29

File tree

6 files changed

+88
-59
lines changed

6 files changed

+88
-59
lines changed

src/Api/Program.cs

Lines changed: 6 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,32 @@
1-
using System.Globalization;
21
using Api.Endpoints;
32
using Api.Setup;
4-
using Azure.Identity;
5-
using Common;
6-
using Microsoft.ApplicationInsights.Extensibility;
73
using Serilog;
8-
using Serilog.Exceptions;
9-
using Serilog.Formatting;
10-
using Serilog.Formatting.Compact;
11-
using Serilog.Formatting.Display;
124

135
DotNetEnv.Env.TraversePath().Load();
146

15-
var config = new ConfigurationBuilder()
16-
.SetBasePath(Directory.GetCurrentDirectory())
17-
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
18-
.AddEnvironmentVariables()
19-
.Build();
20-
21-
const string logFormat = "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] {Message:lj}{NewLine}{Exception}";
22-
23-
Log.Logger = new LoggerConfiguration()
24-
.ReadFrom.Configuration(config)
25-
.WriteTo.Console(outputTemplate: logFormat, formatProvider: CultureInfo.InvariantCulture)
26-
.CreateBootstrapLogger();
27-
287
try
298
{
9+
Log.Logger = LoggingConfigurationExtensions.CreateBootstrapLogger();
10+
3011
Log.Information("Starting up the application");
3112

3213
var builder = WebApplication.CreateBuilder(args);
3314

34-
var keyVaultName = builder.Configuration.GetValue<string>(EnvVarKeys.KeyVaultName);
35-
if (builder.Environment.IsProduction() && !string.IsNullOrEmpty(keyVaultName))
36-
{
37-
var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net/");
38-
builder.Configuration.AddAzureKeyVault(keyVaultUri, new DefaultAzureCredential());
39-
}
15+
builder.Configuration.AddConfiguration(builder.Environment);
4016

41-
builder.Services.ConfigureServices(builder.Environment);
17+
builder.Services.AddServices(builder.Environment);
4218

4319
builder.Host.UseSerilog((ctx, services, loggerConfig) =>
44-
{
45-
ITextFormatter formatter = new MessageTemplateTextFormatter(outputTemplate: logFormat, formatProvider: CultureInfo.InvariantCulture);
46-
47-
if (EnvVarAccessors.UseJsonFormatting)
48-
{
49-
formatter = new CompactJsonFormatter();
50-
}
51-
52-
loggerConfig
53-
.ReadFrom.Configuration(ctx.Configuration)
54-
.Enrich.FromLogContext()
55-
.Enrich.WithExceptionDetails()
56-
.WriteTo.Async(x => x.Console(formatter));
57-
58-
if (ctx.HostingEnvironment.IsProduction())
59-
{
60-
var tc = new TelemetryConfiguration
61-
{
62-
ConnectionString = ctx.Configuration["ApplicationInsights:ConnectionString"]
63-
};
64-
loggerConfig.WriteTo.ApplicationInsights(tc, TelemetryConverter.Traces);
65-
}
66-
},
20+
loggerConfig.AddLoggingConfiguration(ctx.Configuration, builder.Environment),
6721
writeToProviders: false,
6822
preserveStaticLogger: false
6923
);
7024

71-
7225
var app = builder.Build();
7326

7427
app.MapEndpoints();
7528

76-
app.ConfigureMiddleware(app.Environment, app.Configuration);
29+
app.AddMiddleware(app.Environment, app.Configuration);
7730

7831
await app.RunAsync().ConfigureAwait(false);
7932
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Azure.Identity;
2+
using Common;
3+
4+
namespace Api.Setup;
5+
6+
public static class ConfigurationExtensions
7+
{
8+
public static void AddConfiguration(this ConfigurationManager configManager, IWebHostEnvironment environment)
9+
{
10+
var config = new ConfigurationBuilder()
11+
.SetBasePath(Directory.GetCurrentDirectory())
12+
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
13+
.AddEnvironmentVariables()
14+
.Build();
15+
16+
configManager.AddConfiguration(config);
17+
18+
var keyVaultName = configManager.GetValue<string>(EnvVarKeys.KeyVaultName);
19+
if (environment.IsProduction() && !string.IsNullOrEmpty(keyVaultName))
20+
{
21+
var keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net/");
22+
configManager.AddAzureKeyVault(keyVaultUri, new DefaultAzureCredential());
23+
}
24+
}
25+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Globalization;
2+
using Common;
3+
using Microsoft.ApplicationInsights.Extensibility;
4+
using Serilog;
5+
using Serilog.Exceptions;
6+
using Serilog.Extensions.Hosting;
7+
using Serilog.Formatting;
8+
using Serilog.Formatting.Compact;
9+
using Serilog.Formatting.Display;
10+
11+
namespace Api.Setup;
12+
13+
public static class LoggingConfigurationExtensions
14+
{
15+
const string LogFormat = "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz}] [{Level:u3}] {Message:lj}{NewLine}{Exception}";
16+
17+
public static ReloadableLogger CreateBootstrapLogger()
18+
{
19+
var logger = new LoggerConfiguration()
20+
.MinimumLevel.Information()
21+
.WriteTo.Console(outputTemplate: LogFormat, formatProvider: CultureInfo.InvariantCulture)
22+
.CreateBootstrapLogger();
23+
24+
return logger;
25+
}
26+
27+
public static void AddLoggingConfiguration(this LoggerConfiguration loggerConfig, IConfiguration config, IWebHostEnvironment environment)
28+
{
29+
ITextFormatter formatter = new MessageTemplateTextFormatter(outputTemplate: LogFormat, formatProvider: CultureInfo.InvariantCulture);
30+
31+
if (EnvVarAccessors.UseJsonFormatting)
32+
{
33+
formatter = new CompactJsonFormatter();
34+
}
35+
36+
loggerConfig?
37+
.ReadFrom.Configuration(config)
38+
.Enrich.FromLogContext()
39+
.Enrich.WithExceptionDetails()
40+
.WriteTo.Async(x => x.Console(formatter));
41+
42+
if (environment.IsProduction())
43+
{
44+
using var tc = new TelemetryConfiguration
45+
{
46+
ConnectionString = config?["ApplicationInsights:ConnectionString"]
47+
};
48+
loggerConfig?.WriteTo.ApplicationInsights(tc, TelemetryConverter.Traces);
49+
}
50+
}
51+
}

src/Api/Setup/ApiMiddleware.cs renamed to src/Api/Setup/MiddlewareConfigurationExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
namespace Api.Setup;
55

6-
internal static class ApiMiddleware
6+
internal static class MiddlewareConfigurationExtensions
77
{
8-
public static void ConfigureMiddleware(this WebApplication app, IWebHostEnvironment environment, IConfiguration configuration)
8+
public static void AddMiddleware(this WebApplication app, IWebHostEnvironment environment, IConfiguration configuration)
99
{
1010
app.UseExceptionHandler();
1111

src/Api/Setup/ApiServices.cs renamed to src/Api/Setup/ServiceConfigurationExtensions.cs

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

1212
namespace Api.Setup;
1313

14-
internal static class ApiServices
14+
internal static class ServiceConfigurationExtensions
1515
{
16-
public static void ConfigureServices(this IServiceCollection services, IWebHostEnvironment environment)
16+
public static void AddServices(this IServiceCollection services, IWebHostEnvironment environment)
1717
{
1818
services.AddProblemDetails();
1919
services.AddExceptionHandler<GlobalExceptionHandler>();

tests/ArchitectureTests/ServiceRegistrationTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class ServiceRegistrationTests
1212
public void ShouldHave_Scoped_MarketClient()
1313
{
1414
var builder = WebApplication.CreateBuilder();
15-
builder.Services.ConfigureServices(builder.Environment);
15+
builder.Services.AddServices(builder.Environment);
1616

1717
var marketClient = builder.Services.SingleOrDefault(x => x.ServiceType == typeof(IMarketClient));
1818

@@ -24,7 +24,7 @@ public void ShouldHave_Scoped_MarketClient()
2424
public void ShouldHave_Scoped_MarketService()
2525
{
2626
var builder = WebApplication.CreateBuilder();
27-
builder.Services.ConfigureServices(builder.Environment);
27+
builder.Services.AddServices(builder.Environment);
2828

2929
var marketService = builder.Services.SingleOrDefault(x => x.ServiceType == typeof(IMarketService));
3030

0 commit comments

Comments
 (0)