我希望在我的应用程序中动态加载和注册服务。为了做到这一点,我需要能够从解决方案中的不同项目中加载配置文件,并将它们的值合并到单个 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>();
这段代码搜索 App_Config\Include
目录下所有扩展名为 *.json
的文件,并将它们全部添加到配置生成器中。
文件的结构如下:
{
"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; }
}
为了加载该配置,我在构造函数级别(DI)使用
IOptions
:Microsoft.Extensions.Options.IOptions<ServicesConfiguration> servicesConfiguration,
看起来配置已经加载 - 但是从文件中读取的值没有合并,而是被最后找到的文件覆盖了。
有什么想法可以解决这个问题吗?
List<ServiceAssembly> Services
,然后再将其序列化为json文件,并调用AddJson
传递它。 - jpgrassiJSON
文件,解析它们成类,然后将该类注册为单例。这样一来,你就可以随心所欲地处理JSON文件,而且还避免了使用IOptions
模式,这是大多数人(包括我在内)都不喜欢的。 - jpgrassi