[英]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;
}
在構造函數中,我注意到Value2
為null
,即使它確實在配置中顯示為空列表 - 這是我期望用該屬性初始化的值。 我預計只有在配置中缺少字段時才會使用null
初始化該屬性。 有什么辦法可以將字段初始化為空列表嗎?
問題是JSON配置加載器和配置綁定器是兩個獨立的組件。 加載配置時,配置提供程序會將整個配置文件加載到鍵/值結構中,其中鍵是屬性路徑 。 在您的示例中, MyClass:Value2:0
和MyClass:Value2:1
可能是Value2
JSON數組中兩個數組元素的路徑。
然后,配置綁定器將解釋該結構並將其轉換為類的對象。 那時,它將僅具有先前加載的該鍵/值結構中存在的可用信息。
現在,如果在綁定之前查看加載的配置,您會注意到一個空數組不會產生任何結果。 如果你考慮路徑是如何工作的,那就有意義了: MyClass:Value2:0
和MyClass: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.