2017-08-24 67 views
1

从JSON文件加载配置时,我想使用不同的属性名称进行配置。为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工作。有没有可能实现它?

回答

2

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

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

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

由于这两个组件都是独立运行的,即使在对象上运行的binder也是如此,因此它运行得比实际的配置解析过程晚得多 - 它们不能进行通信和共享信息。所以对于JSON配置提供者来说,访问信息是不可能的,绑定器很快会获得关于目标类型的信息。因此,您无法更改配置名称。

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

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

+0

如果我们在谈论配置文件,我同意你的观点。但我正在使用来自环境变量的配置变量 - Docker ENV变量。它们是在容器启动期间配置的,在这种情况下映射一些配置文件是没有意义的。环境变量例如是'S3_ENDPOINT','S3_ACCESS_KEY','SQL_ENDPOINT'。在应用程序中,它的定义有点不同,'S3Configuration {Endpoint {get; set; }和SqlConfiguration {Endpoint {get;设置;}}'。为了实现这种干净的分离,它是理想的。 –

+0

@OndrejTomcik是的,我知道你来自哪里,但内置的配置提供者根本不提供这些功能。标准环境提供者甚至具有[Azure的硬编码处理](https://github.com/aspnet/Configuration/blob/rel/2.0.0/src/Microsoft.Extensions.Configuration.EnvironmentVariables/EnvironmentVariablesConfigurationProvider.cs#L70)它执行一些特定的映射。 - 所以你可能不得不在这里推出你自己的提供者。请记住提供者和联编程序仍然是独立的,因此您的提供程序将映射到配置项,而不是属性。 – poke