gpt4 book ai didi

c# - Configuration.GetSection() 可以轻松获取原始字符串值,但不能获取复杂值

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:24 26 4
gpt4 key购买 nike

这真让我吃惊。我正在使用 Configuration.GetSection 从 appsettings.json 读取值方法,简而言之,我的 appsettings.json 如下所示:

"AppSettings": 
{
"PathPrefix": "",
"Something": "Something else",
"Clients":{"foo": "bar"}
}

现在令我惊讶的是,如果我执行以下操作:
var foo = Configuration.GetSection("AppSettings:Clients:foo").Value;

然后它正确地获取值。它得到值 bar
但是,当我这样做时
 var clients = Configuration.GetSection("AppSettings:Clients").Value;

它返回空值。不仅是这个领域,每当我调用 getSection获取任何复杂对象的方法,然后它返回 null 但是当我调用它来获取基本字符串值时,它会正确获取值 即使看起来,它在获取其父元素时遇到了问题。这让我感到困惑并提出三个问题:
  • 为什么获取复杂值但不能获取基本字符串值会有问题?
  • 是设计使然吗?如果是这样,为什么?
  • 如果我想加载整个对象,我该怎么做?
  • 最佳答案

    您可以使用强类型对象加载整个对象。

    首先,创建一个(或多个)类来保存您的设置。根据您的示例,这看起来像:

    public class AppSettings
    {
    public string PathPrefix { get; set; }
    public string Something { get; set; }
    public Clients Clients { get; set; }
    }

    public class Clients
    {
    public string foo { get; set; }
    }

    现在,您需要将 Options 服务添加到您的服务集合并从配置中加载您的设置:
    public void ConfigureServices(IServiceCollection services)
    {
    // This is only required for .NET Core 2.0
    services.AddOptions();

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

    services.AddMvc();
    }

    您现在可以通过将属性注入(inject)到您的类中来访问它们,例如:
    public class HomeController : Controller
    {
    private readonly AppSettings _settings;

    public HomeController(IOptions<AppSettings> settings)
    {
    _settings = settings.Value;
    }
    }

    您还可以在 ConfigureService 中加载子选项。通过指定要加载的配置部分的方法,例如
    services.Configure<Clients>(Configuration.GetSection("AppSettings:Clients");

    现在可以注入(inject) IOptions<Clients>访问这些设置

    官方文档可见 here

    关于c# - Configuration.GetSection() 可以轻松获取原始字符串值,但不能获取复杂值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50880732/

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