web-dev-qa-db-ja.com

実際にASP.NET CoreのConfigureServicesフェーズでAppSettingsを読み取る

ASP.NET Core 1.0 WebアプリケーションのConfigureServicesメソッドにいくつかの依存関係(サービス)をセットアップする必要があります。

問題は、新しいJSON構成に基づいて、サービスなどをセットアップする必要があることです。

アプリの有効期間のConfigureServicesフェーズの設定を実際に読み取ることができないようです。

public void ConfigureServices(IServiceCollection services)
{
    var section = Configuration.GetSection("MySettings"); // this does not actually hold the settings
    services.Configure<MySettingsClass>(section); // this is a setup instruction, I can't actually get a MySettingsClass instance with the settings
    // ...
    // set up services
    services.AddSingleton(typeof(ISomething), typeof(ConcreteSomething));
}

実際にそのセクションを読み、ISomethingConcreteSomethingとは異なるタイプかもしれません)に登録するものを決定する必要があります。

18
Andrei Rînea

これは、appSettings.jsonからConfigureServicesメソッドでタイプされた設定を取得する方法です。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<MySettings>(Configuration.GetSection(nameof(MySettings)));
        services.AddSingleton(Configuration);

        // ...

        var settings = Configuration.GetSection(nameof(MySettings)).Get<MySettings>();
        int maxNumberOfSomething = settings.MaxNumberOfSomething;

        // ...
    }

    // ...
}
26
Dmitry Pavlov

ASP.NET Core 2.0以降では、Programインスタンスを構築するときに、WebHostクラスで構成のセットアップを行います。そのようなセットアップの例:

return new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((builderContext, config) =>
    {
        IHostingEnvironment env = builderContext.HostingEnvironment;

        config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    })

とりわけ、これによりStartupクラスで構成を直接使用し、コンストラクター注入を介してIConfigurationのインスタンスを取得することができます(組み込みのDIコンテナありがとう):

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    ...
}
9
Set

Configuration["ConfigSection:ConfigValue"])でappsettings.jsonの値にアクセスできます

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<MyContext>(o => 
            o.UseSqlServer(Configuration["AppSettings:SqlConn"]));
    }
}

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "System": "Information",
      "Microsoft": "Warning"
    }
  },
  "AppSettings": {
    "SqlConn": "Data Source=MyServer\\MyInstance;Initial Catalog=MyDb;User ID=sa;Password=password;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;"
  }
}

0
Dave ت Maher