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(); 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); return new ConfigurationRoot(ConfigurationProviders);
} }
@ -33,6 +33,14 @@ namespace Core.Configurations
{ {
List<IConfigurationProvider> _providers = []; 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] public string this[string key]
{ {
get => GetConfiguration(_providers, key); get => GetConfiguration(_providers, key);
@ -58,14 +66,10 @@ namespace Core.Configurations
return value; return value;
} }
} }
public class ConfigurationRoot : Configuration, IConfigurationRoot public class ConfigurationRoot : Configuration, IConfigurationRoot
{ {
List<IConfigurationProvider> IConfiguration.ConfigurationProviders { get; set; }
public ConfigurationRoot(List<IConfigurationProvider> configurationProviders) public ConfigurationRoot(List<IConfigurationProvider> configurationProviders)
{ {
((IConfiguration)this).ConfigurationProviders = configurationProviders; ((IConfiguration)this).ConfigurationProviders = configurationProviders;

View file

@ -8,6 +8,13 @@ namespace Core.Configurations.SmartConfig
{ {
public static class SmartConfigExtension 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) public static IConfigurationBuilder AddSmartConfig(this IConfigurationBuilder builder, string configKey = "DefaultConnection", string path = null)
{ {
return builder.AddProvider(new SmartConfigProvider(builder, configKey, path)); return builder.AddProvider(new SmartConfigProvider(builder, configKey, path));
@ -83,7 +90,7 @@ namespace Core.Configurations.SmartConfig
var pairs = configs.Select(x => new KeyValuePair<string, JToken>(x.Key, JToken.Parse(x.Value.ToString()))); var pairs = configs.Select(x => new KeyValuePair<string, JToken>(x.Key, JToken.Parse(x.Value.ToString())));
_configuration = Common.KeyValueToJson.Convert(pairs); _configuration = Common.KeyValueToJson.Convert(pairs);
} }
public Newtonsoft.Json.Linq.JObject Configuration() public Newtonsoft.Json.Linq.JObject Configuration()

View file

@ -7,6 +7,7 @@ using Autofac;
using System.Data; using System.Data;
using Insight.Database; using Insight.Database;
using Npgsql; using Npgsql;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Tests.ConfigurationTests namespace Tests.ConfigurationTests
{ {
@ -52,7 +53,9 @@ namespace Tests.ConfigurationTests
// Act // Act
var actualFeature = builder.GetSection("Feature").ToObject<Feature>(); var actualFeature = builder.GetSection("Feature").ToObject<Feature>();
#pragma warning disable CS0618 // Type or member is obsolete
var actualFeatureObsoleted = builder.GetSection("Feature").Get<Feature>(); var actualFeatureObsoleted = builder.GetSection("Feature").Get<Feature>();
#pragma warning restore CS0618 // Type or member is obsolete
// Assert // Assert
actualFeature.Should().BeEquivalentTo(expectedFeature); actualFeature.Should().BeEquivalentTo(expectedFeature);
actualFeatureObsoleted.Should().BeEquivalentTo(expectedFeature); actualFeatureObsoleted.Should().BeEquivalentTo(expectedFeature);
@ -74,6 +77,25 @@ namespace Tests.ConfigurationTests
// Assert // Assert
actualFeature.Should().BeEquivalentTo(expectedFeature); 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] [TestMethod]
public void Get_ShouldReturnCorrectValueAsInt() public void Get_ShouldReturnCorrectValueAsInt()
{ {

View file

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

View file

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