1. ホーム
  2. c#

Configuration.GetSection は常に Value プロパティの null を返します。

2023-08-17 20:27:33

質問

毎回 Configuration.GetSection を呼び出すと Value プロパティは常にNULLです。

私の Startup コンストラクタ

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddEnvironmentVariables();

    this.Configuration = builder.Build();
}

私の ConfigureServices メソッド

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<SqliteSettings>(opts => Configuration.GetSection("SqliteSettings").Bind(opts));

    services.AddOptions();

    services.AddMvc();
}

私の appsettings.json

{
  "SqliteSettings": {
    "DataSource": "C:\\db.sqlite",
    "NewDatabase": true,
    "Version": 3
  }
}

SqliteSettingsを定義するために使用しているクラスです。

public class SqliteSettings
{
    public string DataSource { get; set; }

    public bool? NewDatabase { get; set; }

    public int? Version { get; set; }

    public string Password { get; set; }

    public long? CacheSize { get; set; }

    // More properties
}

JSONのプロパティが同じ量でないとマッチしないのか、データ型の定義に関係するのかと思っていましたが、全く関係ないのかもしれませんね。

どのように解決するのですか?

によると マイクロソフト ドキュメント :

<ブロッククオート

GetSection が一致するセクションを返した場合、Value には値が入力されません。A キーとパスは、セクションが存在する場合に返されます。

もしそのセクションの値を見たい場合は、GetChildren() メソッドを呼び出す必要があります。 Configuration.GetSection("SqliteSettings").GetChildren();

あるいは、使用することができます。 Configuration.GetSection("SqliteSettings").Get<SqliteSettings>() . JSONは、マッチするプロパティが同じ量である必要はありません。マッチしないNULL可能なプロパティはNULLに設定され、NULL不可能なマッチしないプロパティはデフォルト値に設定されます(例:intは0に設定されます)。