整个流程整理下。这种简单的Add可以运行。
1先创建ConfigurationSource继承FileConfigurtaionSource
1)ConfigurationBuilder.Add(Source);
2)Builder()->IConfigurationProvider Build(IConfigurationBuilder builder);产生Provider对象。加到ConfigurationRoot中。
2 创建ConfigurationProvide继承FileConfigurationProvide
3 具体使用builder.Configuration.Add<MyConfigurationSource>(config => config.Path="MyFile.json");
4 创建扩展方法*ConfigurationExtension。需要传递
public FileConfigurationProvider(FileConfigurationSource source)
{
ThrowHelper.ThrowIfNull(source);
Source = source;
if (Source.ReloadOnChange && Source.FileProvider != null)
{
_changeTokenRegistration = ChangeToken.OnChange(
() => Source.FileProvider.Watch(Source.Path!),
() =>
{
Thread.Sleep(Source.ReloadDelay);
Load(reload: true);
});
}
}
1关于:ConfigurationBuilder : IConfigurationBuilder
public IConfigurationBuilder Add(IConfigurationSource source)
{
ThrowHelper.ThrowIfNull(source);
Sources.Add(source);
return this;
}
2ConfigurationProvide
public class JsonConfigurationProvider : FileConfigurationProvider
{
/// <summary>
/// Initializes a new instance with the specified source.
/// </summary>
/// <param name="source">The source settings.</param>
public JsonConfigurationProvider(JsonConfigurationSource source) : base(source) { }
/// <summary>
/// Loads the JSON data from a stream.
/// </summary>
/// <param name="stream">The stream to read.</param>
public override void Load(Stream stream)
{
try
{
Data = JsonConfigurationFileParser.Parse(stream);
}
catch (JsonException e)
{
throw new FormatException(SR.Error_JSONParseError, e);
}
}
}
再看这个主要方法:路径必须存在才行。。。
public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, IFileProvider? provider, string path, bool optional, bool reloadOnChange)
{
ThrowHelper.ThrowIfNull(builder);
if (string.IsNullOrEmpty(path))
{
throw new ArgumentException(SR.Error_InvalidFilePath, nameof(path));
}
return builder.AddJsonFile(s =>
{
s.FileProvider = provider;
s.Path = path;
s.Optional = optional;
s.ReloadOnChange = reloadOnChange;
s.ResolveFileProvider();
});
}