【问题标题】:How to reference another value within the same appsettings.json file?如何在同一个 appsettings.json 文件中引用另一个值?
【发布时间】:2020-02-13 05:50:08
【问题描述】:

我在 appsettings.json 的两个地方需要数据库连接字符串。

是否可以在 json 文件中引入公共变量或 json-path 相关引用以避免潜在问题?

如果不用接触 c# 代码就可以拥有它。

{
...
  "ConnectionStrings": {
    "Default": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres"
  },
  "Nlog": {
    "targets": {
      "database": {
        "type": "Database",
        "dbProvider": "Npgsql.NpgsqlConnection, Npgsql",
        "connectionString": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres",
...
      }
    }
...
}

【问题讨论】:

    标签: json asp.net-core .net-core nlog appsettings


    【解决方案1】:

    NLog 能够在 appsettings.json 中查找值。你可以通过${configsetting} 来做到这一点:

    {
    ...
      "ConnectionStrings": {
        "Default": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres"
      },
      "Nlog": {
        "targets": {
          "database": {
            "type": "Database",
            "dbProvider": "Npgsql.NpgsqlConnection, Npgsql",
            "connectionString": "${configsetting:item=ConnectionStrings.Default}",
    ...
          }
        }
    ...
    }
    

    另见https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer

    【讨论】:

    • 有效!可惜不能在一般的appsettings文件中使用
    【解决方案2】:

    我已经为此创建了一个 nuget 包!在这里查看:https://www.nuget.org/packages/TemplateFormattedConfiguration/

    在您的示例中,您应该这样做:

    {
    ...
        "ConnectionStrings": {
    "Default": "Host=localhost;Database=db;Port=5432;Username=postgres;Password=postgres"
      },
      "Nlog": {
        "targets": {
          "database": {
            "type": "Database",
            "dbProvider": "Npgsql.NpgsqlConnection, Npgsql",
            "connectionString": "{ConnectionStrings:Default}",
    ...
          }
        }
    ...
    }
    

    然后在您的 Startup.cs(或 Program.cs)中添加:

            configuration.EnableTemplatedConfiguration();
    

    【讨论】:

      【解决方案3】:

      没有。对此没有任何支持。不过有两件事:

      1. 虽然在每种情况下提供的数据相同,但这两件事相同。当两者恰好使用相同的数据源时,这不是重复,因为情况可能并非如此。

      2. ConnectionStrings 部分没有什么神奇之处,只是它允许您使用GetConnectionString 糖。你也可以这样做:

        services.AddDbContext(o =>
            o.UseSqlServer(Configuration["Nlog:targets:database:connectionString"]));
        

        这是否合适是一个单独的讨论。关键是你没有必须多次获得价值,如果你只是死心塌地反对它。

      【讨论】:

        猜你喜欢
        • 2019-08-17
        • 2018-02-13
        • 2011-03-04
        • 1970-01-01
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多