2017-10-25 4 views
3

私は次の定義を含む構成でasp.net-コアウェブAPIプロジェクトを持っている:設定から空のリストの代わりにプロパティをnullに初期化するのはなぜですか?

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

この構成は、以下のクラスを初期化するために使用されます。

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

このクラスが初期化され

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

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

    services.AddMvc(); 
} 

Startup.csConfigureServices方法で次のコードを使用して、コンフィギュレーション - 私は、プロパティを使用して初期化することが期待される値であり、私はValue2はそれが空のリストのような構成に表示されないにもかかわらず、nullであることがわかり、コンストラクタで

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

:私のサービスのコンストラクタは次のようになります。私は、プロパティが構成からフィールドが欠落している場合にのみnullで初期化されることを期待しました。フィールドを空のリストとして初期化できる方法はありますか?

+3

'Value2'のセッターの中にロジックを作成し、' null'の 'value'が空のリストに解決されるようにすることができます。 – DiskJunky

+0

IList、[]の代わりにIEnumerableのような動的なコレクションを試してみることもあります。 –

+0

@DiskJunky - それは間違いなく私が今持っているよりもはるかにエレガントな解決ですが、設定から直接これを行うにはとにかくかどうか疑問に思っています –

答えて

5

問題は、JSON構成ローダーと構成バインダーは2つの別々のコンポーネントです。構成をロードすると、構成プロバイダーは構成ファイル全体をプロパティー・パスであるキー/値構造にロードします。あなたの例では、MyClass:Value2:0MyClass:Value2:1は、Value2 JSON配列の2つの配列要素のパスになります。

コンフィギュレーションバインダは、後でその構造を解釈し、クラスのオブジェクトに変換します。その時点では、以前にロードされたキー/値構造体に存在する情報しか利用できません。

バインドする前に読み込んだ設定を見ると、空の配列は何も結果にならないことに気付くでしょう。パスがどのように機能するか考えてみると、MyClass:Value2:0MyClass:Value2:1はそれぞれValue2配列のインデックス0と1の値です。しかし、これは空の配列に対してどのように機能しますか?空の配列のエントリは存在しません。

したがって、空の配列がロードされた構成に表示されないため、バインダーは配列を初期化できません。バインドされたコンフィギュレーション・タイプのデフォルト値を設定されているあなたはしかし、行うことができます

:あなたはその型への空の配列を使用して設定をバインドする場合は、今すぐ

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

Value2は、バインダーに心を打たれることはありませんそのデフォルト値は変更されません。

+0

これは徹底的な答えです。私が気にすることは、設定からValue2を完全に削除すると、フィールドはnullの代わりに空の配列になります。 –

+0

ええ、実行時にどのキーが見つからなくなっているのかは分かりません。 – juunas

+1

@MaorVeitsman同じキー/値形式を生成するために必要な、多くの異なる構成プロバイダが利用可能であることに留意する必要があります。つまり、あるフォーマットで可能なセマンティクスは、単純に他のフォーマットと同等ではないため、マップすることはできません。 - これが気になり、欠けている値と空の配列を区別する必要がある場合は、設定を非常に複雑にしている可能性があります。 – poke

関連する問題