web-dev-qa-db-ja.com

appSettings.jsonから値を取得しますか?

Appsettings.jsonで設定された値を取得できません。以下のコードを実行すると、エラーSystem.NullReferenceException: 'Object reference not set to an instance of an object.'が発生します。

私は何が間違っているのですか?

public static IConfigurationRoot Configuration { get; } 
....
string facebookApiId = Configuration.GetValue<string>("Authentication:Facebook:AppId");

appSettings.json

"Authentication": {
  "Facebook": {
    "IsEnabled": "false",
    "AppId": "somevalue1",
    "AppSecret": "somevalue2"
  },
  "Google": {
    "IsEnabled": "false",
    "ClientId": "somevalue3",
    "ClientSecret": "somevalue4"
  }

Startup.cs

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

public IConfigurationRoot Configuration { get; }
6
001

コードには、実際には2つ(2つ)のConfigurationプロパティがあり、1つはStartupにあります。これは、instanceフィールド、および名前のないコントローラーの1つで、staticであり、インスタンス化されていないようです。

構成に関するMSDNの記事 によると、コントローラーにオプションを提供するための推奨される方法は、次のような基本的なオプションと構成オブジェクトロジックを実装することです。

// option mapping classes
public class FacebookOptions
{
    // maybe string here
    public bool IsEnabled { get; set; }
    public string AppId { get; set; }
    public string AppSecret { get; set; }
}

public class GoogleOptions
{
    // maybe string here
    public bool IsEnabled { get; set; }
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
}

// load configuration
public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appSettings.json", optional: true, reloadOnChange: true);

    Configuration = builder.Build();
}

// map the configuration to object
public void ConfigureServices(IServiceCollection services)
{
    // Adds services required for using options.
    services.AddOptions();

    // Register the IConfiguration instance which options binds against.
    services.Configure<FacebookOptions>(Configuration.GetSection("Facebook"));
    services.Configure<GoogleOptions>(Configuration.GetSection("Google"));

    // Add framework services.
    services.AddMvc();
}

これで、依存性注入を介してコントローラーのオプションを簡単に取得できます。

public class GoogleController : Controller
{
    private readonly GoogleOptions _googleOptions;

    public GoogleController(IOptions<GoogleOptions> googleOptionsAccessor)
    {
        _googleOptions = googleOptionsAccessor.Value;
    }
}

構成全体が必要な場合は、すべてのオプションを含む汎用クラスを追加して、同じ記事の オブジェクトグラフマッピング を使用できます。

public class Authentication
{
    public FacebookOptions Google { get; set; }
    public GoogleOptions Google { get; set; }
}

// load configuration
public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appSettings.json", optional: true, reloadOnChange: true);

    Configuration = builder.Build();

    var options = new Authentication();
    config.GetSection("Authentication").Bind(options);
}

編集:これが重要であることが判明したので、クラスと構成セクションに同じ名前が付けられていることを確認してください。

7
VMAtm