Я хотел бы динамически загружать и регистрировать сервисы в моем приложении.Для этого мне нужно иметь возможность загружать файлы конфигурации из разных проектов в решении и объединять значения из них в один массив json.К сожалению, по умолчанию в конфигурации ASP.Net Core значения переопределяются.
Я регистрирую файлы со следующим кодом (часть файла Program.cs):
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((webHostBuilderContext, configurationbuilder) =>
{
var env = webHostBuilderContext.HostingEnvironment;
configurationbuilder.SetBasePath(env.ContentRootPath);
configurationbuilder.AddJsonFile("appsettings.json", false, true);
var path = Path.Combine(env.ContentRootPath, "App_Config\\Include");
foreach(var file in Directory.EnumerateFiles(path, "*.json",SearchOption.AllDirectories))
{
configurationbuilder.AddJsonFile(file, false, true);
}
configurationbuilder.AddEnvironmentVariables();
})
.UseStartup<Startup>();
Код ищет все файлы с расширением *.json
в каталоге App_Config\Include
и добавляет всеих к конструктору конфигурации.
Структура файлов выглядит следующим образом:
{
"ServicesConfiguration": {
"Services": [
{
"AssemblyName": "ParsingEngine.ServicesConfigurator, ParsingEngine"
}
]
}
}
Как видите, у меня есть основной раздел ServicesConfiguration
затем Services
массив с объектами, которые имеют один атрибут AssemblyName
.
Чтобы прочитать эти значения, я использую ServicesConfiguration
класс со списком:
public class ServicesConfiguration
{
public List<ServiceAssembly> Services { get; set; }
}
И этот список использует ServiceAssembly
класс:
public class ServiceAssembly
{
public string AssemblyName { get; set; }
}
Для загрузки этой конфигурацииЯ использую IOptions
на уровне конструктора (DI):
Microsoft.Extensions.Options.IOptions<ServicesConfiguration> servicesConfiguration,
И кажется, что конфигурация загружена - но значения из файлов не объединяются, а переопределяются последним найденным файлом.
Любые идеикак это исправить?