Для создания и использования источника пользовательской конфигурации необходимы две реализации:
IConfigurationSource
IConfigurationProvider
Это реализация IConfigurationSource
, которая добавляется к источникам IConfigurationBuilder
. Эта реализация также отвечает за создание собственного IConfigurationProvider
, который отвечает за загрузку данных из источника.
Здесь представлены пользовательские реализации IConfigurationSource
(ExpandJsonConfigurationSource
) и IConfigurationProvider
(ExpandJsonConfigurationProvider
):
public class ExpandJsonConfigurationSource : JsonConfigurationSource
{
public override IConfigurationProvider Build(IConfigurationBuilder builder)
{
EnsureDefaults(builder);
return new ExpandJsonConfigurationProvider(this);
}
}
public class ExpandJsonConfigurationProvider : JsonConfigurationProvider
{
public ExpandJsonConfigurationProvider(ExpandJsonConfigurationSource source)
: base(source) { }
public override void Load()
{
base.Load();
Data = Data.ToDictionary(
x => x.Key,
x => Environment.ExpandEnvironmentVariables(x.Value));
}
}
Здесь мало что происходит. Эти реализации просто следуют тому же подходу, что и существующие реализации JsonConfigurationSource
и JsonConfigurationProvider
, с настраиваемой обработкой для расширения переменных среды.
Чтобы заменить предварительно сконфигурированные источники на основе JSON, используйте следующее:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((ctx, builder) =>
{
var jsonConfigurationSources = builder.Sources
.OfType<JsonConfigurationSource>()
.ToList();
foreach (var jsonConfigurationSource in jsonConfigurationSources)
{
var indexOfJsonConfigurationSource = builder.Sources
.IndexOf(jsonConfigurationSource);
builder.Sources.RemoveAt(indexOfJsonConfigurationSource);
builder.Sources.Insert(
indexOfJsonConfigurationSource,
new ExpandJsonConfigurationSource
{
FileProvider = jsonConfigurationSource.FileProvider,
Path = jsonConfigurationSource.Path,
Optional = jsonConfigurationSource.Optional,
ReloadOnChange = jsonConfigurationSource.ReloadOnChange
});
}
});
Делегат, переданный в ConfigureAppConfiguration
, выполняет следующие действия:
- Поиск всех настроенных экземпляров
JsonConfigurationSource
. Должно быть два экземпляра: для appsettings.json
и, например, appsettings.Development.json
. Для каждого экземпляра:
- Определите положение экземпляра в предварительно сконфигурированных источниках.
- Удалить экземпляр.
- Заменить удаленный экземпляр на экземпляр
ExpandJsonConfigurationSource
, скопировав через свойства, чтобы убедиться, что он имеет тот же путь, дополнительный флаг и т. Д. c.