using NetCore.AutoRegisterDi; using Microsoft.Extensions.Configuration; using CaddyManager.Contracts.Configurations; namespace CaddyManager.Services.Configurations; /// [RegisterAsSingleton] public class ConfigurationsService(IConfiguration configuration) : IConfigurationsService { /// public T Get() where T : class { var section = typeof(T).Name; // Have the configuration section name be the section name without the "Configurations" suffix if (section.EndsWith("Configurations")) section = section[..^"Configurations".Length]; else if (section.EndsWith("Configuration")) section = section[..^"Configuration".Length]; var result = configuration.GetSection(section).Get(); var defaults = Activator.CreateInstance(); if (result is null) return defaults; // The .NET 10 binder writes nulls over property initialisers, so put the defaults back foreach (var property in typeof(T).GetProperties()) { if (property is { CanRead: true, CanWrite: true } && property.GetValue(result) is null) property.SetValue(result, property.GetValue(defaults)); } return result; } }