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.Name
和 Config.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 的接口。然后,您可以在代码中使用它。
我无法让 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.Name
和 Config.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 的接口。然后,您可以在代码中使用它。