gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:14:58 25 4
gpt4 key购买 nike

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

让我首先使用可变类进行演示。

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 更改为私有(private),它们就不再由配置生成器设置:

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-configmaster 分支使用可变的 Config 类,而 immutable-config 分支使用不可变的 Config 类。 p>

最佳答案

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

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

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

关于ASP.NET 5(即 Core 1.0)不可变配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35044260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com