ASP.NET Core 1.0ベースの構成

11590 ワード

ソースhttps://docs.asp.net/en/latest/fundamentals/configuration.html
ASP.NET Core 1.0では、さまざまな構成オプションがサポートされています.アプリケーション構成データは、Json、XML、INIなどのフォーマットから作成できます.これらのフォーマットはすべて組み込みサポートです.もちろん、構成データは環境変数からも使用できます.自分の環境providerを書くこともできます.
Githubからサンプルコードをダウンロードできます.
環境設定の取得と設定
ASP.NET Core 1.0の環境システムは、システムに依存する以前とは異なり、再設計されている.Configurationと似たようなweb.configなどのxmlファイルです.新しい構成モデルでは、構成は異なるproviderから取得でき、streamlinedキー値ペアの取得をサポートします.新しいoptions patternを使用すると、アプリケーションとフレームワークが構成を取得できます.
構成の問題を処理するには、Startupクラスでコンフィギュレーションオブジェクトをインスタンス化し、options patternを使用して異なる構成にアクセスすることが推奨されます.
簡単に言えば、コンフィギュレーションはproviderを構成する一連の集合であり、キーペア値の読み取りと書き込みの機能を提供する.コンフィギュレーションが正常に動作するように、少なくとも1つのproviderを構成します.次の例では、キーペア値として格納されているコンフィギュレーションをどのようにテストするかを示します.
// assumes using Microsoft.Framework.ConfigurationModel is specified
var builder = new ConfigurationBuilder();
builder.Add(new MemoryConfigurationProvider());
var config = builder.Build();
config.Set("somekey", "somevalue");

// do some other work

string setting2 = config["somekey"]; // also returns "somevalue"

Note:少なくとも1つのproviderを設定する必要があります
通常、構成データは階層的に格納され、特に外部ファイルを使用する場合、Json、XML、INIなどである.この場合、構成データは、区切り記号:で取得できます.次のプロファイルを考慮
{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=aspnet5-WebApplication1-8479b9ce-7b8f-4402-9616-0843bc642f09;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}

設定ファイルを使用して接続文字列を構成し、この値を取得するには、このようなキーデータ:DefaultConnection:ConnectionsStringを使用します.options patternを使用すると、アプリケーションに必要な構成をデカップリングし、指定した構成のメカニズムを取得できます.options patternを使用するには、独自の設定クラス(いくつかの異なるクラス、いくつかの異なる集約の設定グループに対応するかもしれません)を作成する必要があります.これにより、optionsサービスを使用してアプリケーションに注入することができます.次にconfigurationまたは選択したメカニズムを使用してsettingsを指定できます.Note:コンフィギュレーションインスタンスをサービスとして格納できますが、アプリケーションと単一の構成システム、および特定の構成keysを結合する必要はありません.この問題を回避するためにOptions patternを使用する必要があります.
組み込みproviderの使用
コンフィギュレーションフレームワークには、JSON、XML、INIプロファイルのサポートが内蔵されており、同じサポートメモリのコンフィギュレーション(コードに直接値を設定する)、環境コンフィギュレーションとコマンドラインパラメータからコンフィギュレーションが取得されています.開発者はproviderに限らない.実際には、いくつかのproviderを一緒に使用することができます.これにより、デフォルトの構成は、他のproviderが提供する構成によって上書きされます(存在する場合).拡張方法により、他のプロファイルproviderのサポートを実現できます.これらのメソッドは、以下のようにコンフィギュレーションビルダーによって個別に呼び出されるか、fluent APIとして呼び出される.
var config = builder.Build();

builder.AddEntityFramework(options => options.UseSqlServer(config["Data:DefaultConnection:ConnectionString"]));
config = builder.Build();

configuration providersの順序は重要です.これは、複数の位置に構成されると、どの構成が適用されるかを決定するためです.上記の例のように、appsettingsが同じ値で存在する場合.jsonと環境変数では、環境変数の構成が適用されます.構成に複数の場所がある場合、最後のproviderで指定した値は前の値を上書きします.ASP.NETチームは、環境変数の構成を最後にすることを推奨し、ローカル環境変数が配置されたプロファイルを上書きします.Note:shellでネストされた値を環境変数で上書きします.「:」ではなく「」を使用します.(double undercore).
環境ベースのプロファイルを使用すると、次のように便利です.
public Startup(IHostingEnvironment env)
{
    // Set up configuration providers.
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

IHostingEnvironmentサービスは現在の環境を取得するために使用され、Development環境では6行目のコードがappsettingsを検索する.Development.jsonファイル、存在する場合は、その構成項目を使用して他の値を書き換えます.詳細はWorking with Multiple Environmentsを参照してください.
Warning:パスワードやその他の機密情報をproviderコードやプロファイルに保存してはいけません.開発およびテスト環境で本番環境パスワードを使用するべきではありません.実際には、これらの情報はプロジェクトツリーの外で指定する必要があります.これにより、provider倉庫に偶発的にコミットされることを回避できます.詳細は、Multiple EnvironmentsおよびSafe Storage of Application Secretsの管理を参照してください.
コンフィギュレーションの優先順位を使用する方法の1つは、デフォルト値を使用し、デフォルト値を上書きすることです.次のコンソール・プログラムでは、usernameのデフォルト値はMemoryConfigurationProviderで指定され、コマンド・ライン・パラメータにusernameの値が指定されている場合、その値は書き換えられます.複数のConfiguration providerの異なるフェーズでのプログラムの出力を表示できます.
using System;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Memory;

namespace ConfigConsole
{
    public class Program
    {
        public void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            Console.WriteLine("Initial Config Providers: " + builder.Providers.Count());

            var defaultSettings = new MemoryConfigurationProvider();
            defaultSettings.Set("username", "Guest");
            builder.Add(defaultSettings);
            Console.WriteLine("Added Memory Provider. Providers: " + builder.Providers.Count());

            builder.AddCommandLine(args);
            Console.WriteLine("Added Command Line Provider. Providers: " + builder.Providers.Count());

            var config = builder.Build();
            string username = config["username"];

            Console.WriteLine($"Hello, {username}!");
        }
    }
}

ただし、プログラムの実行時にコマンドラインパラメータが上書きされない限り、プログラムはデフォルト値を出力します.
Optionsと構成オブジェクトの使用
Optionsを使用すると、任意のPOCOクラスを設定クラスに簡単に変換できます.推奨される方法は、アプリケーションで何らかのfeatureに対応して、良好なデカップリングされた構成オブジェクトを作成することです.インタフェース分離の原則(ISP)に従うとともに、注目点分離も満たす(異なる部分の構成は別々に管理されるため、相互に不利な影響を減らす).簡単なMyOptionsの例を次に示します
public class MyOptions
{
    public string Option1 { get; set; }
    public int Option2 { get; set; }
}

OptionsサービスでOptionsをアプリケーションに注入できます.例えば、MVCコントローラは、IOptionsを使用してindexビューを埋め込むために必要な構成を取得する.
public class HomeController : Controller
{
    public HomeController(IOptions<MyOptions> optionsAccessor)
    {
        Options = optionsAccessor.Value;
    }

    MyOptions Options { get; }

    // GET: /<controller>/
    public IActionResult Index()
    {
        return View(Options);
    }
}

詳細については、注入に依存する.IOpitonsサービスを開始するには、StartupクラスのConfigureServicesで拡張メソッドAddOptions()を呼び出す必要があります.
public void ConfigureServices(IServiceCollection services)
{
    // Setup options with DI
    services.AddOptions();
}

Indexビューには、拡張メソッドConfigureによってオプションを構成する次のように表示されます.delegateを使用するか、optionsをConfigurationにバインドできます.
public void ConfigureServices(IServiceCollection services)
{
    // Setup options with DI
    services.AddOptions();

    // Configure MyOptions using config
    services.Configure<MyOptions>(Configuration);

    // Configure MyOptions using code
    services.Configure<MyOptions>(myOptions =>
    {
        myOptions.Option1 = "value1_from_action";
    });

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

optionsをconfigurationにバインドすると、構成クラスの属性バインドのkeyにはproperty:subproperty:...で行ないます.例えばOption 1にバインドされたkeyはappsettingsからOption 1である.jsonのoption 1キーで読み込まれました.コンフィギュレーションキーは大文字と小文字が敏感ではないことに注意してください.
コンフィギュレーションを呼び出すたびにIConfigurationsがサービスコンテナに追加され、コンフィギュレーションオプションがアプリケーションまたはフレームワークに提供されます.データベースから設定を読み込むなど、別の方法でオプションを直接構成したい場合は、コンフィギュレーションオプションのサービスを直接使用できます.
同じ構成オプションでは、複数のIConfigurationサービスを使用することができ、順番に機能します.上記の例では、Option 1とOption 2の値はいずれもappsettingsである.jsonで指定しますが、option 1の値はconfiguration delegateで上書きされます.
カスタムproviderの書き込み
内蔵のconfiguration providerを使用するだけでなく、自分のものを書くこともできます.ConfigurationProviderクラスを継承し、populate the Data property with the settings from your configuration providerを継承するだけです.
例:EF設定
アプリケーション設定オプションをデータベースに格納し、EFを使用して取得したい場合があります.この例では、EFを使用してデータベース内のname-valueペアを読み出す簡単なconfiguration providerを作成します.まず、データベースにデータを格納するためにConfigurationValueを定義します.
public class ConfigurationValue
{
    public string Id { get; set; }
    public string Value { get; set; }
}

EFを使用してコンフィギュレーションオプション値を格納または取得するには、コンフィギュレーションContextも必要です.
public class ConfigurationContext : DbContext
{
    public ConfigurationContext(DbContextOptions options) : base(options)
    {
    }

    public DbSet<ConfigurationValue> Values { get; set; }

}

次にconfiguration providerを作成します.構成データは、Loadメソッドを書き換えることによってロードされ、データベースからすべての構成データが読み出されます.プレゼンテーションの目的で、データベースが存在しない場合とpopulateの場合、configuration providerはまずデータベースを作成して初期化します.
public class EntityFrameworkConfigurationProvider : ConfigurationProvider
{
    public EntityFrameworkConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
    {
        OptionsAction = optionsAction;
    }

    Action<DbContextOptionsBuilder> OptionsAction { get; }

    public override void Load()
    {
        var builder = new DbContextOptionsBuilder<ConfigurationContext>();
        OptionsAction(builder);

        using (var dbContext = new ConfigurationContext(builder.Options))
        {
            dbContext.Database.EnsureCreated();
            Data = !dbContext.Values.Any()
                ? CreateAndSaveDefaultValues(dbContext)
                : dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
        }
    }

    private IDictionary<string, string> CreateAndSaveDefaultValues(ConfigurationContext dbContext)
    {
        var configValues = new Dictionary<string, string>
            {
                { "key1", "value_from_ef_1" },
                { "key2", "value_from_ef_2" }
            };
        dbContext.Values.AddRange(configValues
            .Select(kvp => new ConfigurationValue() { Id = kvp.Key, Value = kvp.Value })
            .ToArray());
        dbContext.SaveChanges();
        return configValues;
    }
}

また、configuration providerを追加するには、AddEntityFramework拡張メソッドを追加する必要があります.
public static class EntityFrameworkExtensions
{
    public static IConfigurationBuilder AddEntityFramework(this IConfigurationBuilder builder, Action<DbContextOptionsBuilder> setup)
    {
        return builder.Add(new EntityFrameworkConfigurationProvider(setup));
    }
}

次の例では、アプリケーションでカスタムconfiguration providerを使用する方法を示します.コンフィギュレーションビルダーを作成してconfiguration provdersをsetupします.EntityFrameworkConfigurationProviderを追加し、data providerと接続文字列を指定します.接続文字列の構成方法もちろん、構成を使用してappsettingsを追加します.jsonファイルはconfiguration providerとしてEntityFrameworkConfiguration Providerを起動します.コンフィギュレーションビルダーを多重化することで、データ内のどの構成データもappsettingsを書き換えることができる.jsonのデータ.
public class Program
{
    public static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder();
        builder.AddJsonFile("appsettings.json");
        builder.AddEnvironmentVariables();
        var config = builder.Build();

        builder.AddEntityFramework(options => options.UseSqlServer(config["Data:DefaultConnection:ConnectionString"]));
        config = builder.Build();

        Console.WriteLine("key1={0}", config["key1"]);
        Console.WriteLine("key2={0}", config["key2"]);
        Console.WriteLine("key3={0}", config["key3"]);

    }
}

プログラムを実行すると、次の結果が表示されます.
まとめ
ASP.NET Core 1.0は、さまざまなファイルタイプの構成、コマンドライン、メモリ、環境変数などの構成をサポートする柔軟性の高い構成モデルを提供します.彼はoptionsとシームレスに接続できるので、強いタイプの構成をアプリケーションやフレームワークに注入することができます.また、独自のconfiguration providerを作成して、埋め込まれたproviderと協力したり、置き換えたりすることもできます.