[英]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; }
}
DataMember
和JsonProperty
不起作用。 有没有可能实现它?
不幸的是,这是不可能的。 此处负责的组件是 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.