-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
73 lines (59 loc) · 2.09 KB
/
Program.cs
File metadata and controls
73 lines (59 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using OrderMonitor.Core.Interfaces;
using OrderMonitor.Infrastructure;
using OrderMonitor.Infrastructure.Configuration;
using Serilog;
// Configure Serilog early for startup logging
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateBootstrapLogger();
try
{
Log.Information("Starting Order Monitor API");
var builder = WebApplication.CreateBuilder(args);
// Add YAML configuration sources (before builder.Build)
// Override precedence: appsettings.json → YML file → environment variables
var environment = builder.Environment.EnvironmentName;
builder.Configuration
.AddYamlFile("OrderMonitor_ENV.yml", optional: true)
.AddYamlFile($"OrderMonitor_ENV.{environment.ToLowerInvariant()}.yml", optional: true)
.AddEnvironmentVariables();
// Configure Serilog from appsettings
builder.Host.UseSerilog((context, services, configuration) => configuration
.ReadFrom.Configuration(context.Configuration)
.ReadFrom.Services(services)
.Enrich.FromLogContext()
.WriteTo.Console());
// Add services to the container
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Add infrastructure services (database, repositories, config validation)
builder.Services.AddInfrastructure(builder.Configuration);
// Add health checks
builder.Services.AddHealthChecks();
var app = builder.Build();
// Validate configuration at startup
var validator = app.Services.GetService<IConfigurationValidator>();
validator?.Validate();
// Configure the HTTP request pipeline
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseSerilogRequestLogging();
app.UseAuthorization();
app.MapControllers();
app.MapHealthChecks("/health");
app.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}
// Make the implicit Program class public for testing
public partial class Program { }