繁体   English   中英

Configuration.GetSection()轻松获取原始字符串值,但不获取复杂值

[英]Configuration.GetSection() easily gets primitive string values but not complex values

这真让我惊讶。 我正在使用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;

它返回null。 不仅是这个字段,每当我调用getSection方法来获取任何复杂对象时,它都将返回null,但是当我调用它以获取基本字符串值时, 即使看似我仍然可以正确地获取该值,但在获取其父元素时遇到了问题。 这让我感到困惑,并提出了三个问题:

  1. 为什么在获取复杂值而不获取基本字符串值时会有问题?
  2. 是设计使然吗? 如果是这样,为什么?
  3. 如果要加载整个对象,该怎么做?

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

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

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; }
}

现在,您需要将“选项”服务添加到服务集合中,并从配置中加载设置:

public void ConfigureServices(IServiceCollection services)
{
    // This is only required for .NET Core 2.0
    services.AddOptions();

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

    services.AddMvc();
}

现在,您可以通过将属性注入到类中来访问属性,例如:

public class HomeController : Controller
{
    private readonly AppSettings _settings;

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

您还可以通过指定要加载的配置节来在ConfigureService方法中加载子选项。

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

现在,您可以注入IOptions<Clients>来访问那些设置

官方文档可以在这里找到

您希望它返回什么? 您可以使用Get<T>扩展方法获取复杂的对象。 尝试这个:

var clients = Configuration.GetSection("AppSettings:Clients").Get<YourClientsType>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM