asp.netコアアプリケーション構成のリロード

オリジナル: ASP.NETアプリケーションの構成リロードコア

asp.netコアアプリケーション構成のリロード

イントロ

私は、データベースに置くかのRedisを設定し、私は直接データベースを変更したい場合に設定を変更して、アプリケーション構成のリロードにインターフェースを呼び出す必要があるので、彼は書き込み実行時のインターフェイスのコンフィギュレーションをリロードしてみました。

達成の設定リロード

インターフェイスの設定は実際には非常に簡単ですリロードし、目を通すConfiguration知っているソースコードは、アプリケーションの設定を再ロードする場合必要がIConfigurationRootターゲットに、そしてIConfigurationRoot実際には直接取得するサービスに注入することができるIConfigurationオブジェクトを、サービスIConfigurationオブジェクトも達成されたIConfigurationRootインタフェースのインスタンスを。その後、我々は多くが明確であることを一緒にソースコードを参照してください。

構成コードをリロード達成するために見て

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace TestWebApplication.Controllers
{
    [Route("api/[controller]")]
    public class ConfigurationsController : Controller
    {
        private readonly IConfigurationRoot _configuration;

        public ConfigurationsController(IConfiguration configuration)
        {
            _configuration = configuration as IConfigurationRoot;
        }

        [HttpGet]
        public IActionResult Get()
        {
            return Ok(new
            {
                RootUser = _configuration.GetAppSetting("RootUser") // 这里 GetAppSetting 是一个自定义扩展方法,获取AppSettings 节点下的配置信息
            });
        }

        [HttpPut]
        public IActionResult Put()
        {
            _configuration.Reload();
            return Ok();
        }
    }
}

ライト

        /// <summary>
        /// 重新加载系统配置
        /// </summary>
        /// <returns></returns>
        public IActionResult ReloadConfiguration()
        {
            var configurationRoot = HttpContext.RequestServices.GetService<IConfiguration>() as IConfigurationRoot;
            if (null == configurationRoot)
            {
                return BadRequest();
            }
            configurationRoot.Reload();
            return Ok();
        }

それは単純ではない、あなたはこれを参照することができ、のはそれを試してみましょうサンプルプロジェクト

以来、あなたが変更した場合、プロジェクトのデフォルトの設定を再リロードします、appsettings.jsonファイルの変更かどうかを監視し、ここで私はここで設定した新しいファイルを追加reloadOnChangeするためにfalse、次のようにサンプルコードを:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(configBuilder =>
                {
                    configBuilder.AddJsonFile("abc.json", optional: true, reloadOnChange: false);
                })
                .UseStartup<Startup>();

次のように文書abc.json読み取ります。

{
  "AppSettings": {
    "TestNumber": 12,
    "RootUser": "WeihanLi"
  }
}

dotnet runWebサイトを起動し、ブラウザで訪問のhttp:// localhostを:5000 / API /構成

私たちは、その後、ファイルabc.jsonを変更します

{
  "AppSettings": {
    "TestNumber": 12,
    "RootUser": "WeihanLi 123"
  }
}

ただページを更新して保存した変更したら、コンテンツを見ることができるか、単にコンフィギュレーションをリロードしないことを証明するために、設定を再ロードするために私たちの次の試み

あなたはPUTリクエストを送信したいと郵便配達員やシオマネキや他のツールを使用しhttp://localhost:5000/api/configurationsて、ここで私は郵便配達の呼び出しは、インターフェイスコンフィギュレーションをリロードPUT使用

コンフィギュレーションをリロード

つまり、インターフェイスが200コールが成功した、ただページを更新返し、ページ上のデータを見ることができるのも、私たちが力の設定インターフェースをリロードすることを証明している、変更されています。

ソース決意

ConfigurationBuilderたときにビルド、何をすべきかでConfigurationBuilderソース

ConfigurationBuilder.Build()

ここでは、最後のリターンがある見ることができIConfigurationRoot、ターゲット、その後、見IConfigurationRootソースコード

IConfigurationRoot

あなたは見ることができるIConfigurationRootの定義Reload方法は、以下からこの方法をProviders我々が知ることができる場所を確認、設定をリロードするアプリケーションの設定を再ロードする方法を、その後、私たちは見てきた何済のhttps:// github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs#L149IConfigurationReloadWebHost.CreateDefaultBuilder(args).Build()

ウェブホスト

appsettings.jsonが自動的に設定ファイルをリロードします理由はここに私たちが見ることができる、あなたは最後のリターンを見ることができるWebHostBuilderオブジェクト

Asp.Netコア見てWebHostBuilderオブジェクトのBuildメソッドをhttps://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L135

BuildCommonServicesコードのこの部分を見ることができるhttps://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L277

image.png

我々はすでに知っていることの上にConfigurationBuilderリターンが後にビルドしIConfigurationRootたオブジェクト、およびこの注入はIConfiguration、ターゲット(IConfigurationRoot実装するIConfigurationインタフェースを)ので、私たちはから依存性の注入を得ることができるIConfigurationように直接オブジェクトIConfigurationRoot我々が直接取得する理由は、使用する、IConfigurationオブジェクトを直接as IConfigurationRoot

メモ

一時的にこの目的を達成するために、私はあなたが何かを得ることを願って -

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/11386810.html