为ASP.NET Core中的选项自定义JSON属性名称

时间:2017-08-24 08:03:08

标签: c# asp.net-core

从JSON文件加载配置时,我想使用不同的属性名称进行配置。

public class MinioConfiguration
{
    [DataMember(Name = "MINIO_ENDPOINT")]
    public string Endpoint { get; set; }
    [DataMember(Name = "MINIO_ACCESS_KEY")]
    public string AccessKey { get; set; }
    [DataMember(Name = "MINIO_SECRET_KEY")]
    public string SecretKey { get; set; }
}

DataMemberJsonProperty都不起作用。是否有可能实现它?

3 个答案:

答案 0 :(得分:5)

遗憾的是,这是不可能的。这里负责的组件是JSON配置提供程序(Microsoft.Extensions.Configuration.Json)和配置绑定程序(Microsoft.Extensions.Configuration.Binder)。前者负责将JSON文件加载到IConfiguration,而后者的工作是将IConfiguration映射到类型。

然而,配置绑定器与源无关,因此它不关心配置的来源,无论是JSON,内存配置还是环境变量。因此,设计人员无法在目标类型上查找特定于源的属性。

另一方面,不保证配置绑定到任何类型,因此配置提供程序需要一致地工作,无论它是否绑定到类型。因此,JSON提供程序遵循自己的约定将JSON属性映射到配置键。

由于两个组件独立运行 - 绑定器甚至在IConfiguration对象上显式运行,因此它比实际配置解析过程运行得晚得多 - 它们无法通信和共享信息。因此,JSON配置提供程序根本不可能访问该信息,该绑定器很快就会获得目标类型。因此,您根本无法更改配置名称。

但是,我认为这不是应该做的事情。配置是一个非常特定于应用程序的东西,但是如果您想使用看起来像是要使用不一定归应用程序所有的配置文件的不同密钥。我建议不要使用这种方法,而是使用特定于应用程序的配置文件。

如果您需要重用该配置文件,您可以随时为该特定类型编写自己的配置提供程序。编写配置提供程序并不困难,尤其是当您打算将其限制为非常特定的格式时。

答案 1 :(得分:5)

万一有人碰到这个。

这是老办法:

  public class ServiceConfig
  {
    private string web_internal
    {
      // Note it does not work without this noop getter
      get => "it's hack for Microsoft.Configuration.Binder";
      set => WebInternal = value;
    }

    public string WebInternal { get; set; }
  }

然后将其绑定到哪里

var serviceConfig = config.Get<ServiceConfig>(o => o.BindNonPublicProperties = true);

尽管我认为Microsoft应该添加支持以覆盖名称。

这与与ConfigurationSource的关系无关,而与ConfigurationBinder本身有关-如果看到该属性具有DataMember属性,则应使用该属性而不是密钥的属性名称

答案 2 :(得分:0)

现在可以使用 ConfigurationKeyNameAttribute 实现这一点,在 .NET 6 Preview 4 中可用。 查看here了解更多详情。