Configuration 稍后在程序中添加到.NET核心配置

Configuration 稍后在程序中添加到.NET核心配置,configuration,.net-core,Configuration,.net Core,这是我的.NET核心应用程序的设置: public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) { return WebHost.CreateDefaultBuilder(args

这是我的.NET核心应用程序的设置:

 public class Program
 {
     public static void Main(string[] args)
     {
         BuildWebHost(args).Run();
     }

     public static IWebHost BuildWebHost(string[] args)
     {
         return WebHost.CreateDefaultBuilder(args)
             .UseKestrel()
             .UseContentRoot(Directory.GetCurrentDirectory())
             .UseIISIntegration()
             .ConfigureAppConfiguration((builderContext, config) =>
             {
                 var entryAssemblyFolder = new FileInfo(Assembly.GetEntryAssembly().Location).DirectoryName;
                 IHostingEnvironment env = builderContext.HostingEnvironment;
                 config
                     .SetBasePath(entryAssemblyFolder)
                     .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
             })
             .UseStartup<Startup>()
             .Build();
     }
 }

 public class Startup
 {
     public Startup(IConfiguration configuration)
     {
         Configuration = configuration;
     }

     public static IConfiguration Configuration { get; set; }
 }
公共类程序
{
公共静态void Main(字符串[]args)
{
BuildWebHost(args.Run();
}
公共静态IWebHost BuildWebHost(字符串[]args)
{
返回WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.ConfigureAppConfiguration((builderContext,config)=>
{
var entryAssemblyFolder=新文件信息(Assembly.GetEntryAssembly().Location).DirectoryName;
IHostingEnvironment env=builderContext.HostingEnvironment;
配置
.SetBasePath(entryAssemblyFolder)
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true);
})
.UseStartup()
.Build();
}
}
公营创业
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共静态IConfiguration配置{get;set;}
}
当程序启动时,上述所有操作都会运行。在程序执行期间的稍后时间点,我希望能够根据启动时未知的数据添加额外的配置。以下是伪代码,因为ConfigurationBuilder构造函数没有参数:

public class Helper
 {
     public void Add(string key, string value)
     {
         //pseudo-code:
         var builder = new ConfigurationBuilder(Startup.Configuration);  

         builder.AddInMemoryCollection(new List<KeyValuePair<string, string>>
         {
             new KeyValuePair<string, string>(key, value)
         });

         Startup.Configuration = builder.Build();
     }
 }
公共类助手
{
公共void添加(字符串键、字符串值)
{
//伪代码:
var builder=新配置builder(Startup.Configuration);
builder.AddInMemoryCollection(新列表
{
新的KeyValuePair(键,值)
});
Startup.Configuration=builder.Build();
}
}
如何添加到现有配置中,同时保留现有配置(包括reloadOnChange:true)


谢谢,

我进一步挖掘了这个问题的根源。提供者将初始数据复制到自己的数据属性中

因此,即使您更新了原始字典,当它被初始化时,提供程序仍然只有原始值

还没有尝试过可能有效的
GetReloadToken
方法,但这里有一种更直接的替代方法

将此视为您的配置:

公共类MyConfiguration
{
MemoryCollection中的公共静态词典=
新词典
{
{“InMemoryCollection:Option1”,“value1”},
{“InMemoryCollection:Option2”,“value2”}
};
}
初始化您的配置:

公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(生成器=>{
builder.AddInMemoryCollection(MyConfiguration.InMemoryCollection);
})
.UseStartup();
假设您有一个控制器来读取和输入新值:

[路由(“api/[控制器]”)]
[ApiController]
公共类值控制器:控制器库
{
私有IConfigurationRoot配置;
/// 
///初始化类的新实例。
///通过DI注入的价值。
/// 
///配置。
公共价值控制器(IConfiguration配置)
{
this.configuration=(IConfigurationRoot)配置;
}
[HttpGet]
/// 
///获取内存中的值。
/// 
/// 
公共IDictionary Get()
{
var result=newdictionary();
this.configuration.GetSection(“InMemoryCollection”).Bind(结果);
返回结果;
}
[HttpPost]
/// 
///输入一个新值。
/// 
///价值。
公共作废帖子([FromBody]字符串值)
{
//从配置根目录获取提供程序实例。
MemoryConfiguration提供程序memoryProvider=
(MemoryConfiguration提供程序)this.configuration.Providers
.第一(p=>
p、 GetType()==typeof(MemoryConfigurationProvider));
//将新选项添加到提供者数据集合中。
var nextKey=MyConfiguration.InMemoryCollection.Count+1;
memoryProvider.Add(
$“InMemoryCollection:选项{nextKey}”,
价值);
}
}
注意:我不知道动态添加的配置选项的详细信息/要求,但使用
AddInMemoryCollection
方法似乎不是最好的选择。当然,除非你故意不想坚持下去。
不过,我相当肯定有其他方法/解决方案可以解决此问题,而不必使用Microsoft.Extensions.Configuration API。

似乎对AddInMemoryCollection方法的功能存在误解。内存中的集合是配置的数据提供程序,最好在实际构建配置之前设置。重新创建生成器无法实现动态重新加载配置更改的目的。我同意。我不想重建。我这样做是为了代替我所要求的一个合适的解决方案。