あなたがASPであなたのアプリ構成を管理する方法を学んでください.ネットコア


TLRこの記事では、ASP . NETの構成管理のハイレベルビューを示します.ネットそれは様々なソース、プロバイダについて教えてどのように設定データを読む.また、あなたの設定データ型を安全にする方法を示します.
なぜ我々は設定が必要ですか?さて、答えは、我々は必ずしもそれを再コンパイルせずに実行するアプリケーションを必要とすることです.その理由は、異なる環境に柔軟にすることです.それはちょうどアプリケーションのための完全に新しいエンドポイントに向かって行くために設定値を変更するのに十分なはずです.ASP .NETは私たちの背中を持っている、それはコンフィグデータは、JSONやINI、環境変数やAzureのような100万の異なる場所、ファイルから来ることができる知っている.ASP .ASP . NETには、サービスのセットがあります.
どのようなプロバイダが存在しているかを知る必要があります(したがって、我々は設定データをどこに置くことができるかを知っています).また、すべてのデータがキー値のペアであることを知るのに役立ちます.しかし、ネストされてからデータを停止しません.私たちがネストして、型付けされて、タイプされて対処することができる2つの異なる方法があると心配しないでください.
つ以上の時間を構成管理に重要な次元を強調しましょう

  • コンフィグデータは多くのソースから来ることができます.データは、JSONファイル、環境変数、Azureサービスなどのようないくつかの異なるソースから読み取ることができます.以下に、すべての異なるソースのリストを示します.
  • appsettingsのような設定ファイル.JSON
  • 環境変数
  • アジュールキーボルト
  • Azureアプリの設定
  • コマンドライン引数
  • カスタムプロバイダー、インストールまたは作成
  • ディレクトリファイル
  • メモリーで.ネットオブジェクト
  • 設定データは一定の順序で読み込まれます.ホスト設定は、AppSettingsで見つけられたJSONデータに続く最初のものです.JSONと環境特有のバージョン.完全な読み取り順序は以下のようになります.
  • ChainedConfigurationProvider : 既存を追加するIConfiguration ソースとして.既定の構成ケースでは、ホスト構成を追加し、アプリケーション構成の最初のソースとして設定します.
  • アプリケーションの設定jsonファイル.appsettingsがあります.JSON設定プロバイダーを使用して読み込まれます.
  • 環境固有のアプリケーション設定JSON.最初のappsettingsの後.JSONは、それは環境固有のアプリケーション設定ファイルから読み取るように読んでいます.したがって、本質的には、このフォーマットappsettingsのファイルを探しています.環境.JSON構成プロバイダーを使用したJSON.例えば、appsettings.生産JSONまたはappsettings開発JSON
  • アプリの秘密.dev環境で動作している場合は、次の秘密を読みます.
  • 環境変数.その後、環境変数設定プロバイダーを使用して任意の環境変数を読み込みます.
  • コマンドライン引数.最後に、コマンドライン設定プロバイダーを使用してコマンドライン引数を読み込みます.
  • NOTE, if the same key exist in two different sources it's the latter one that gets applied. For example i a key exist in appsetttings.json, that value will be overwritten if it also exist as an environment variable.


  • 機密データを設定データとして配置しないでください.どのようなデータが敏感であるかを知る必要があります.親指の規則として、AzureキーVaultのようなサービスに敏感なデータを配置し、設定ファイルにそのようなデータを配置しないようにしてください!あなたはまだ構成マネージャを使用してAzureキーVaultから読むことができるので、理論では、例えば、JSONファイルからデータを読むこととしてまっすぐ進む.

  • 参考文献
    私はいくつかのうまくいけば便利なリンクを残したので、すべての異なるプロバイダやオプションについての詳細を学ぶことができます.うまくいけば、この記事はあなたに学習を継続する良い基盤を与える.
  • Builder settings
  • Configuration management docs for ASP .NET

  • データを読み込む
    構成データを読むにはプログラムに注意を向けることができます.CSとそのコンストラクタです.
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }
    
    ここでは、インスタンスの注入IConfiguration . それはappsettingsからデータを読むことを試みるでしょう.JSONファイルなので、どのようにアクセスできますか?appsettingsの内容を見ること.JSONのように見えます.
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*"
    }
    
    非入れ子になった値を読むAllowedHosts 以下のように入力できます:
    Configuration["AllowedHosts"]  // *
    
    しかし、ログのようなネストされた値が必要な場合は: をセパレータとします.そうではなく、
    var value = Configuration["Logging:LogLevel:Default"];
    Console.WriteLine(value); // Information
    

    NOTE, you are likely to want to access this kind of data when setting up services so you are more likely to read from Configuration instance in ConfigureServices() method rather than the constructor, as is demonstrated above. With that said, all you need to do is to inject IConfiguration in any constructor where you might need it, like a controller for example, like so:


    public IndexModel(ILogger<IndexModel> logger, IConfiguration configuration )
    {
        _logger = logger;
        _configuration = configuration;
    
        var serviceConfig = new ServiceConfiguration();
        _configuration.GetSection(serviceConfig.Services).Bind(serviceConfig);
        Console.WriteLine(serviceConfig.CartServiceUrl);
        Console.WriteLine(serviceConfig.ProductsServiceUrl);
    }
    

    デモ、値をオーバーライド
    私たちは以前に、読まれる最後のプロバイダーが設定データに値を決めたものであると述べました.セッティングを置くことによってデモをしましょうAPI appsetのように.JSON :
    "API": "http://localhost:3000/api"
    
    そして今、appsettingsで少し異なるエントリを置きます.開発JSONのように:
    "API": "http://localhost:5000/api"
    
    コードを変更するStartup コンストラクタAPI , 以下のように:
    var value = Configuration["API"];
    Console.WriteLine(value); // http://localhost:5000/api
    
    見ることができるように、最後の読み取りソース、appsettings.開発JSONは価値を決めた.

    データをバインドする
    いくつかの時点で、どのような設定を追跡する可能性があります.ネスティングの様々なレベルで10 - 20の異なるキー、またはより多くを持っている可能性があります.問題は、それが乱雑になり始めているということです.キーが実際に使用されているかを知ることは、JSONファイル、環境変数、あるいはソースコードを調べることの組み合わせかもしれません.それではどのようにアプローチし、そのような混乱を管理するのですか?
    それを管理する方法は、ほとんどの物事を管理する方法です.ネットとCは、それをタイプします.アイデアは、使用する予定のほとんどのもののためのクラスのような変数や構造を持つことです.では、どのようにして設定データを入力しますか? -クラスを使用します.
    いくつかのエンドポイントを仮定しましょうProductsServiceUrl and CartServiceUrl それを追跡し、異なる環境で異なる値に設定する必要があります.以下のようにクラスを作成できます:
    class ServiceConfiguration 
    {
      public const string Services = "Services";
      public string ProductsServiceUrl { get; set; }
      public string CartServiceUrl { get; set; }
    }
    
    我々がしたいのは、ASPを伝えることです.ASP . NETは、上記クラスのインスタンスを設定の特定のセクションにバインドします.あなたがAppSettingsのセクションを知っていると想像してください.JSONのようになります.
    "Services" : {
      "ProductsServiceUrl": "http://localhost:3000/products",
      "CartServiceUrl": "http://localhost:3000/cart" 
    }
    
    一度このクラスを作成し、設定データを追加してデータを読み出す時間です.のコンストラクタを見つけることによってデータを読むことができますStartup 起動時のクラス.次のコードを追加します.
    var serviceConfig = new ServiceConfiguration();
    Configuration.GetSection(serviceConfig.Services).Bind(serviceConfig);
    Console.WriteLine(serviceConfig.CartServiceUrl); // http://localhost:3000/cart
    Console.WriteLine(serviceConfig.ProductsServiceUrl); // http://localhost:3000/products
    
    の使用GetSection() 私たちは私たちのための興味深い設定の一部にドリルダウンすることができます.使用bind() セクションの内容をServiceConfiguration そして、それによって、設定セクションから値でインスタンスを占拠します.

    概要
    さまざまな情報源にどのように設定データが存在するかを学びました.また、どのようにASPを学んだ.NETはこれらの情報源から読むことができました.さらに、ネストされたデータとネストしていないデータを読む方法は様々です.最後に、設定データを安全にする方法を見ました.