Add configuration type binding and implement database connection, disable NativeAOT.
Add: binding setting file items to `AppSettings` class so to provide DI access as `IOptions<OptixServeSettings>`. Add: EF Core and DbContext to access database in services. This results in disabling NativeAOT due to poor supports for *pre-compiled query*, however many design are optimized for AOT for later re-adoption. Add: `DesignTimeDbContextFactory` to support EF Core migrations in NativeAOT. (Kept for re-enabling AOT.) Add: `DbInitializer` for ensuring database connecting in startup. Add: `ConfigurationHelper.CreateDefaultBuilder()` to read configuration files in default locations. Note this method is currently ONLY used by `DesignTimeDbContextFactory`. Refactor is expected. Add: `CommonErrorDto` for simple error message. Add: `VersionEndpoint` ONLY for debugging and testing purpose. Verylikely to be removed in the future. Other: many utilities and fixes easy to understand. Note: EF Core migrations are excluded in the early development. Not expected to be added in version control before v1.0 beta.
This commit is contained in:
@ -1,6 +1,9 @@
|
||||
using System.CommandLine;
|
||||
using OptixServe.Api.Configuration;
|
||||
using OptixServe.Api.Endpoints;
|
||||
using OptixServe.Core.Data;
|
||||
using OptixServe.Core.Services;
|
||||
using OptixServe.Api.Utilites;
|
||||
|
||||
class Program
|
||||
{
|
||||
@ -46,8 +49,15 @@ class Program
|
||||
builder.RegiserJsonContext();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
using (var scope = app.Services.CreateScope())
|
||||
{
|
||||
var initializer = scope.ServiceProvider.GetRequiredService<DbInitializer>();
|
||||
initializer.Initialize();
|
||||
}
|
||||
|
||||
var apiGroup = app.MapGroup("api/v1");
|
||||
ExtensionMethods.RegisterEndpoints(apiGroup);
|
||||
StartupHelper.RegisterEndpoints(apiGroup);
|
||||
|
||||
app.Run();
|
||||
});
|
||||
@ -62,7 +72,7 @@ class Program
|
||||
/// <summary>
|
||||
/// Contains extension methods for WebApplicationBuilder and WebApplication
|
||||
/// </summary>
|
||||
static class ExtensionMethods
|
||||
static class StartupHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds configuration sources to the application builder
|
||||
@ -88,6 +98,37 @@ static class ExtensionMethods
|
||||
builder.Configuration.AddConfiguration(configurationBuilder.Build());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures DbContext services
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
/// <param name="configuration"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddAppDatabase(this IServiceCollection services, DatabaseSettings dbSettings)
|
||||
{
|
||||
services.AddDbContext<AppDbContext>(options => DatabaseHelper.ConfigureDbContext(options, dbSettings));
|
||||
return services;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures services for DI
|
||||
/// </summary>
|
||||
/// <param name="builder">WebApplicationBuilder instance</param>
|
||||
public static void RegisterServices(this WebApplicationBuilder builder)
|
||||
{
|
||||
// Add configuration class
|
||||
var optixSettigns = builder.Configuration.GetSection("OptixServe");
|
||||
var onConfigSettings = optixSettigns.Get<OptixServeSettings>();
|
||||
builder.Services.Configure<OptixServeSettings>(optixSettigns);
|
||||
|
||||
// Add DBContext class
|
||||
builder.Services.AddAppDatabase(onConfigSettings?.Database!);
|
||||
builder.Services.AddScoped<DbInitializer>();
|
||||
|
||||
// Application services
|
||||
builder.Services.AddScoped<IUserService, UserService>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures JSON serialization options with custom context
|
||||
/// </summary>
|
||||
@ -97,26 +138,18 @@ static class ExtensionMethods
|
||||
builder.Services.ConfigureHttpJsonOptions(options =>
|
||||
{
|
||||
options.SerializerOptions.TypeInfoResolverChain.Add(UserJsonContext.Default);
|
||||
options.SerializerOptions.TypeInfoResolverChain.Add(VersionJsonContext.Default);
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configures services for DI
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
public static void RegisterServices(this WebApplicationBuilder builder)
|
||||
{
|
||||
// Application services
|
||||
builder.Services.AddScoped<IUserService, UserService>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers all API endpoints
|
||||
/// </summary>
|
||||
/// <param name="app">WebApplication instance</param>
|
||||
/// <param name="rootGroup">Root RouteGroupBuilder instance</param>
|
||||
public static void RegisterEndpoints(RouteGroupBuilder rootGroup)
|
||||
{
|
||||
UserEndpoint.Register(rootGroup);
|
||||
VersionEndpoint.Register(rootGroup);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user