ASP.NET 5(即 Core 1.0)不可变配置

ASP.NET 5 (i.e. Core 1.0) Immutable Configuration

我无法让 ASP.NET 5(即 Core 1.0)使用不可变配置 classes.

让我先用一个可变的 class 来演示。

config.json

{
  "Name": "Lou",
  "Age": 30
}

Config.cs(可变)

   public class Config
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }

在 Startup.cs

中注册
public void ConfigureServices(IServiceCollection services)
{
    var configBuilder = new ConfigurationBuilder()
        .AddJsonFile("config.json");

    var config = configBuilder.Build();
    services.Configure<Config>(config);

    services.AddMvc();
}

上面的代码运行良好,Config.NameConfig.Age 的值符合预期。

但是一旦我将 Config 的 属性 setter 更改为私有,它们就不再由配置生成器设置:

public class Config
{
    public string Name { get; private set; } // == null
    public int Age { get; private set; } // == 0
}

我原以为 ASP.NET 5 会像 ASP.NET 4 那样使用反射并设置属性,而不是简单地忽略它们。我错过了什么吗?

我创建了一个示例项目来演示:https://github.com/johnnyoshika/mvc6-immutable-config master 分支使用可变 Config class 而 immutable-config 分支使用不可变 Config class.

ConfigurationBinder 对象没有设置私有属性:https://github.com/aspnet/Configuration/blob/ba1d9b4cbc363db9318f201f08fbfecc72e7922b/src/Microsoft.Extensions.Configuration.Binder/ConfigurationBinder.cs#L64-L82

这是一个跟踪问题:https://github.com/aspnet/Configuration/issues/394

解决此问题的一种方法是创建一个仅包含由 Config 代码实现的 getter 的接口。然后,您可以在代码中使用它。