Asp.net core ASP.NET核心的json配置文件中的变量替换?

Asp.net core ASP.NET核心的json配置文件中的变量替换?,asp.net-core,Asp.net Core,我想为我的ASP.NET核心项目使用JSON配置,如下所述: 我的配置如下所示: config .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnCha

我想为我的ASP.NET核心项目使用JSON配置,如下所述:

我的配置如下所示:

config
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{commandConfig["Site"]}.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables();
在每个appsettings..json中,我可以这样说:

{
    "Site": "siteName1"
}
但这似乎是浪费。我想把它放在appsettings.json中:

并根据需要使用变量替换$Site


这样做可能吗?

我不确定这是否可能

我建议使用环境变量:

var mySiteVariable = Environment.GetEnvironmentVariable("MySiteVariable");

config
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{mySiteVariable}.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables();
更新:

如果不想使用其他json文件,可以使用AddInMemoryCollection。链中稍后添加的配置将覆盖链中较早配置中的变量

config.SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddInMemoryCollection(new Dictionary<string, string>()
    {
        {"MyConfigVariable", "overwrite with this value"}
    });

没有内在的方式来做你想做的事。如果您真的愿意,您可以自己读取和解析json文件。

我不确定这是否可行

我建议使用环境变量:

var mySiteVariable = Environment.GetEnvironmentVariable("MySiteVariable");

config
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{mySiteVariable}.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables();
更新:

如果不想使用其他json文件,可以使用AddInMemoryCollection。链中稍后添加的配置将覆盖链中较早配置中的变量

config.SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddInMemoryCollection(new Dictionary<string, string>()
    {
        {"MyConfigVariable", "overwrite with this value"}
    });

没有内在的方式来做你想做的事。如果您真的愿意,您可以自己读取和解析json文件。

我为此创建了一个库,它完全符合您的期望。见: 您只需要将其注册为另一个配置源

例如,如果在配置中定义了以下三个条目:

Foo={Bar1}{Bar2}{Bar1} Bar1=咖啡师 Bar2=-Jean-
当从配置中请求Foo时,您将得到:Barista Jean Barista

我为此创建了一个库,它完全符合您的期望。见: 您只需要将其注册为另一个配置源

例如,如果在配置中定义了以下三个条目:

Foo={Bar1}{Bar2}{Bar1} Bar1=咖啡师 Bar2=-Jean-
当从配置中请求Foo时,您将得到:Barista Jean Barista

应该用什么替换$Site?@DavidG是的,此语法中的任何内容都不允许这样做,因此我想在最后做一些事情,比如.SubstituteVariablescontext;并在上下文映射中传入站点。好吧,让我重新表述一下我要去的地方。。。如果您想用特定的已知值替换,那么您已经知道该值了,对吗?是的。但是,如果我有20个站点,管理20个站点配置文件,不仅包括它们的站点设置,还包括它们的日志位置c:\logs\${site},它们的错误电子邮件主题[${site}]错误,等等,这是非常痛苦的。与手动替换和维护20个站点特定的文件相比,在appsettings.json`中只指定这三个文件一次要好得多。为什么有20个配置文件?这没有道理。您有一个具有可替换值的配置文件。例如config.EmailSubject.Replace$Site,thenameofthisite$Site应该用什么替换?@DavidG是的,这个语法中没有任何东西允许这样做,所以我想在最后做一些事情,比如.SubstituteVariablescontext;并在上下文映射中传入站点。好吧,让我重新表述一下我要去的地方。。。如果您想用特定的已知值替换,那么您已经知道该值了,对吗?是的。但是,如果我有20个站点,管理20个站点配置文件,不仅包括它们的站点设置,还包括它们的日志位置c:\logs\${site},它们的错误电子邮件主题[${site}]错误,等等,这是非常痛苦的。与手动替换和维护20个站点特定的文件相比,在appsettings.json`中只指定这三个文件一次要好得多。为什么有20个配置文件?这没有道理。您有一个具有可替换值的配置文件。例如,config.EmailSubject.Replace$Site,thenameofthisteno,没有抓住要点。我不想在配置文件名中放入替换的内容,我希望文件本身的设置被替换。正如我所说,我不确定这是否可行。您最好通过添加新的配置来覆盖配置设置,该配置可以由环境变量或其他动态确定。它甚至不必是json(见我的udpate)。是否可以在某处添加一个层来“解释”配置值,以便在运行时替换它们?我不太清楚你的意思,但在运行时,如果你愿意,你肯定可以用新值重建配置。不,这没有抓住重点。我不想在配置文件名中放入替换的内容,我希望文件本身的设置被替换。正如我所说,我不确定这是否可行。您最好通过添加新的配置来覆盖配置设置,该配置可以由环境变量或其他动态确定。它甚至不必是json(见我的udpate)。是否可以在某处添加一个层来“解释”配置值,以便它们可以被替换
我不太清楚你说的是什么意思,但在运行时,如果你想的话,你肯定可以用新的值重建你的配置。