簡體   English   中英

為什么屬性從配置初始化為null而不是空列表?

[英]Why does a property get initialized to a null instead of an empty list from configuration?

我有一個asp.net-core web api項目,其配置包含以下定義:

"MyClass": {
   "Value1": 1,
   "Value2": []
}

此配置用於初始化以下類:

public class MyClass
{
    public int Value1 { get; set; }
    public int[] Value2 { get; set; }
}

使用Startup.cs ConfigureServices方法中的以下代碼從配置初始化此類:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();

    services.Configure<MyClass>(Configuration.GetSection("MyClass"));
    services.AddSingleton<AService>();

    services.AddMvc();
}

我的服務構造函數如下所示:

public FeedbackRetrievalService(IOptions<MyClass> myclass)
{
    _myclass = myclass;
}

在構造函數中,我注意到Value2null ,即使它確實在配置中顯示為空列表 - 這是我期望用該屬性初始化的值。 我預計只有在配置中缺少字段時才會使用null初始化該屬性。 有什么辦法可以將字段初始化為空列表嗎?

問題是JSON配置加載器和配置綁定器是兩個獨立的組件。 加載配置時,配置提供程序會將整個配置文件加載到鍵/值結構中,其中鍵是屬性路徑 在您的示例中, MyClass:Value2:0MyClass:Value2:1可能是Value2 JSON數組中兩個數組元素的路徑。

然后,配置綁定器將解釋該結構並將其轉換為類的對象。 那時,它將僅具有先前加載的該鍵/值結構中存在的可用信息。

現在,如果在綁定之前查看加載的配置,您會注意到一個空數組不會產生任何結果。 如果你考慮路徑是如何工作的,那就有意義了: MyClass:Value2:0MyClass:Value2:1 1分別是Value2數組的索引0和1的值。 但是如何為空數組工作? 根本沒有空數組的條目。

因此,由於空數組未出現在已加載的配置中,因此綁定器無法初始化您的數組。

但是,您可以為綁定配置類型設置默認值:

public class MyClass
{
    public int Value1 { get; set; }
    public int[] Value2 { get; set; } = Array.Empty<int>();
}

現在,如果將配置與該空數組綁定到該類型,則綁定程序將永遠不會觸及Value2 ,保持其默認值不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM