diff --git a/src/Nacos.Microsoft.Extensions.Configuration/ConfigListener.cs b/src/Nacos.Microsoft.Extensions.Configuration/ConfigListener.cs index 1aa687a..3a139ae 100644 --- a/src/Nacos.Microsoft.Extensions.Configuration/ConfigListener.cs +++ b/src/Nacos.Microsoft.Extensions.Configuration/ConfigListener.cs @@ -16,5 +16,10 @@ public class ConfigListener /// Configuration group /// public string Group { get; set; } + + /// + /// Configuration format + /// + public string Format { get; set; } } } diff --git a/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationProvider.cs b/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationProvider.cs index c686c90..1b11314 100644 --- a/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationProvider.cs +++ b/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationProvider.cs @@ -3,6 +3,7 @@ using global::Microsoft.Extensions.Configuration; using global::Microsoft.Extensions.Logging; using Nacos.V2; + using Nacos.V2.Utils; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -14,6 +15,7 @@ internal class NacosV2ConfigurationProvider : ConfigurationProvider, IDisposable private readonly NacosV2ConfigurationSource _configurationSource; private readonly INacosConfigurationParser _parser; + private readonly IReadOnlyDictionary _parsers; private readonly INacosConfigService _client; @@ -27,6 +29,7 @@ public NacosV2ConfigurationProvider(NacosV2ConfigurationSource configurationSour { _configurationSource = configurationSource; _parser = configurationSource.NacosConfigurationParser; + _parsers = configurationSource.NacosConfigurationParsers; _configDict = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); _listenerDict = new Dictionary(); @@ -55,6 +58,18 @@ public NacosV2ConfigurationProvider(NacosV2ConfigurationSource configurationSour } } + private INacosConfigurationParser GetParser(string format) + { + if (format.IsNullOrWhiteSpace()) return _parser; + + if (_parsers.TryGetValue(format, out var parser)) + { + return parser; + } + + throw new InvalidOperationException("Missing parser for format: " + format); + } + internal IDictionary GetData() => Data; public void Dispose() @@ -92,7 +107,7 @@ public override void Load() _configDict.AddOrUpdate($"{_configurationSource.GetNamespace()}#{listener.Group}#{listener.DataId}", config, (x, y) => config); - var data = _parser.Parse(config); + var data = GetParser(listener.Format).Parse(config); foreach (var item in data) { @@ -167,7 +182,7 @@ public void ReceiveConfigInfo(string configInfo) continue; } - var data = _provider._parser.Parse(config); + var data = _provider.GetParser(listener.Format).Parse(config); foreach (var item in data) { diff --git a/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationSource.cs b/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationSource.cs index 40a8b30..7a5c475 100644 --- a/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationSource.cs +++ b/src/Nacos.Microsoft.Extensions.Configuration/NacosV2ConfigurationSource.cs @@ -29,6 +29,12 @@ public class NacosV2ConfigurationSource : Nacos.V2.NacosSdkOptions, IConfigurati /// public INacosConfigurationParser NacosConfigurationParser { get; set; } + public Dictionary NacosConfigurationParsers { get; } = + new Dictionary() + { + { "json", DefaultJsonConfigurationStringParser.Instance } + }; + public NacosV2ConfigurationSource(INacosConfigService client, ILoggerFactory loggerFactory) { Client = client;