我想在我的应用程序中动态加载和注册服务。为此,我需要能够从解决方案中的不同项目加载配置文件,并将它们的值合并到单个 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
then Services
包含具有一个属性的对象的数组AssemblyName
.
为了读取我使用的这些值ServicesConfiguration
带有列表的类:
public class ServicesConfiguration
{
public List<ServiceAssembly> Services { get; set; }
}
该列表使用ServiceAssembly
class:
public class ServiceAssembly
{
public string AssemblyName { get; set; }
}
为了加载我使用的配置IOptions
在构造函数级别 (DI):
Microsoft.Extensions.Options.IOptions<ServicesConfiguration> servicesConfiguration,
配置似乎已加载 - 但文件中的值不会合并,而是被最后找到的文件覆盖。
有什么想法如何解决这个问题吗?