Finalizes ConfigurationBuilder with indexer

This commit is contained in:
Janus C. H. Knudsen 2025-02-11 19:34:45 +01:00
parent 1f675498a2
commit 6839cd82e2
5 changed files with 43 additions and 11 deletions

View file

@ -23,7 +23,7 @@ namespace Core.Configurations
{
provider.Build();
}
//TODO: we need to come up with merge strategy
//TODO: we need to come up with merge strategy, right now the latest key-path dominates
return new ConfigurationRoot(ConfigurationProviders);
}
@ -33,6 +33,14 @@ namespace Core.Configurations
{
List<IConfigurationProvider> _providers = [];
/// <summary>
/// Implements a string-based indexer for backwards compatibility with Microsoft.Extensions.Configuration.
/// This implementation is marked as obsolete and should be replaced with type-safe alternatives.
/// </summary>
/// <param name="key">The configuration key to retrieve.</param>
/// <returns>The configuration value for the specified key.</returns>
/// <exception cref="NotSupportedException">Thrown when attempting to set a value, as this operation is not supported.</exception>
[Obsolete("Use type-safe configuration methods instead")]
public string this[string key]
{
get => GetConfiguration(_providers, key);
@ -58,14 +66,10 @@ namespace Core.Configurations
return value;
}
}
public class ConfigurationRoot : Configuration, IConfigurationRoot
{
List<IConfigurationProvider> IConfiguration.ConfigurationProviders { get; set; }
public ConfigurationRoot(List<IConfigurationProvider> configurationProviders)
{
((IConfiguration)this).ConfigurationProviders = configurationProviders;

View file

@ -8,6 +8,13 @@ namespace Core.Configurations.SmartConfig
{
public static class SmartConfigExtension
{
/// <summary>
///
/// </summary>
/// <param name="builder"></param>
/// <param name="configKey">Name of key</param>
/// <param name="path">If this is different than the default ConnectionStrings-element, then configure it.</param>
/// <returns></returns>
public static IConfigurationBuilder AddSmartConfig(this IConfigurationBuilder builder, string configKey = "DefaultConnection", string path = null)
{
return builder.AddProvider(new SmartConfigProvider(builder, configKey, path));

View file

@ -7,6 +7,7 @@ using Autofac;
using System.Data;
using Insight.Database;
using Npgsql;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Tests.ConfigurationTests
{
@ -52,7 +53,9 @@ namespace Tests.ConfigurationTests
// Act
var actualFeature = builder.GetSection("Feature").ToObject<Feature>();
#pragma warning disable CS0618 // Type or member is obsolete
var actualFeatureObsoleted = builder.GetSection("Feature").Get<Feature>();
#pragma warning restore CS0618 // Type or member is obsolete
// Assert
actualFeature.Should().BeEquivalentTo(expectedFeature);
actualFeatureObsoleted.Should().BeEquivalentTo(expectedFeature);
@ -74,6 +77,25 @@ namespace Tests.ConfigurationTests
// Assert
actualFeature.Should().BeEquivalentTo(expectedFeature);
}
/// <summary>
/// Testing a stupid indexer for compability with Microsoft ConfigurationBuilder
/// </summary>
[TestMethod]
public void Indexer_ShouldReturnValueAsString()
{
// Arrange
var expected = "SHA256";
var builder = new ConfigurationBuilder()
.AddJsonFile("appconfiguration.dev.json")
.Build();
// Act
var actual = builder["Authentication"];
// Assert
actual.Should().BeEquivalentTo(expected);
}
[TestMethod]
public void Get_ShouldReturnCorrectValueAsInt()
{

View file

@ -69,7 +69,7 @@ namespace Tests
.SingleInstance();
builder.RegisterModule(new Core.ModuleRegistry.DbPostgreSqlModule
builder.RegisterModule(new Database.ModuleRegistry.DbPostgreSqlModule
{
ConnectionString = configuration.GetConnectionString("DefaultConnection")
});
@ -86,8 +86,6 @@ namespace Tests
[TestCleanup]
public void CleanUp()
{
//Serilog.Log.CloseAndFlush();
Trace.Flush();
var telemetryClient = Container.Resolve<TelemetryClient>();
telemetryClient.Flush();

View file

@ -6,6 +6,7 @@
"ApplicationInsights": {
"ConnectionString": "InstrumentationKey=6d2e76ee-5343-4691-a5e3-81add43cb584;IngestionEndpoint=https://northeurope-0.in.applicationinsights.azure.com/"
},
"Authentication": "SHA256",
"Feature": {
"Enabled": true,
"RolloutPercentage": 25,