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;