簡體   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