繁体   English   中英

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

[英]Customize JSON property name for options in 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不起作用。 有没有可能实现它?

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

然而,配置绑定器是源不可知的,所以它不关心配置来自哪里,无论是 JSON、内存配置还是环境变量。 因此,按照设计,活页夹无法在目标类型上查找特定于源的属性。

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

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

但是,我认为无论如何这都不是应该做的事情。 配置是一个非常特定于应用程序的东西,但是如果你想使用不同的键,看起来你想使用一个不一定由应用程序拥有的配置文件。 我建议不要使用这种方法,而是使用特定于应用程序的配置文件。

如果您需要重用该配置文件,您始终可以为该特定类型编写自己的配置提供程序。 编写配置提供程序并没有那么困难,尤其是当您无论如何都要将其限制为非常特定的格式时。

万一有人遇到这种情况。

这是它的旧黑客:

  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);

虽然我认为微软应该增加对覆盖名称的支持。

这不是关于与ConfigurationSource的关系,而是关于ConfigurationBinder本身 - 如果它看到该属性具有DataMember属性,那么它应该使用它而不是键的属性名称。

现在可以使用ConfigurationKeyNameAttribute ,在 .NET 6 Preview 4 中可用。查看此处了解更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM