NET 5設定の変更は再起動せずに自動的に有効

NET 5設定の変更は再起動せずに自動的に有効

NET Core、. NET 5のデフォルト設定は一度だけロードされ、設定を変更すると再起動する必要があります。

最后更新 2021/09/18 11:35
包子wxl
预计阅读 3 分钟
分类
ASP.NET Core
标签
.NET C# ASP.NET Core プロファイルProfile

1.リアルタイムで有効になるプロファイルの設定

1.1構成

am.

設定ファイルが変更されると、プログラムはファイルの変更をリッスンし、自動的にリロードします。

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();

            });

1.2検証済み

appsettings.jsonファイルは以下の通りです。

{
  "TestSetting": "123",
  "AppOptions": {
    "UserName": "zhangsan"
  }
}

コードコード:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly IConfiguration _configuration;
    public HomeController(ILogger<HomeController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    public IActionResult Index()
    {
        string Name = _configuration["TestSetting"];
        string Name2 = _configuration["AppOptions:UserName"];
        ViewBag.Name = Name;
        ViewBag.Name2 = Name2;
        return View();
    }
}

インターフェース表示:

設定ファイルを次のように変更します。

{
  "TestSetting": "abc",
  "AppOptions": {
    "UserName": "zhangsan123"
  }
}

ページの更新、変更:

1.3 IOptionsはリアルタイムで有効

新規AppOptions.csクラス

/// <summary>
/// 配置文件
/// </summary>
public class AppOptions
{
    public string UserName { get; set; }
}

Startup.csでオプションに設定を追加する

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
}

使用する:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly IConfiguration _configuration;
    private IOptionsMonitor<AppOptions> _options;

    public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
    {
        _logger = logger;
        _configuration = configuration;
        _options = appOptions;
    }

    public IActionResult Index()
    {
        string Name = _configuration["TestSetting"];
        string Name2 = _options.CurrentValue.UserName;
        ViewBag.Name = Name;
        ViewBag.Name2 = Name2;
        return View();
    }
}

IOptionsは3つの方法

1. IOptions<T>          //站点启动后,获取到的值永远不变
2. IOptionsMonitor<T>   //站点启动后,如果配置文件有变化会发布事件 (加载配置时,reloadOnChange:true 必须为true)
3. IOptionsSnapshot<T>  //站点启动后,每次获取到的值都是配置文件里的最新值 (加载配置时,reloadOnChange:true 必须为true)

** ご注意:**

IOptionsMonitor TとIOptionsSnapshot Tの最大の違いは、前者は他のシングルトンサービスで使用できますが、後者は使用できません。前者はシングルトンとして登録され、後者はScopedとして登録されます。つまり、ファイルが変更されると、前者は即座に再ロードされますが、後者はリクエストごとに再ロードされます。

例として:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private UserService _userService;

    public HomeController(ILogger<HomeController> logger, UserService userService)
    {

        _userService = userService;
    }

    public IActionResult Index()
    {
        string Name2 = _userService.GetName();
        ViewBag.Name2 = Name2;
        return View();
    }
}
public class UserService
{
    private IOptionsMonitor<AppOptions> _options;

    public UserService(IOptionsMonitor<AppOptions> appOptions)
    {
        _options = appOptions;
    }

    public string GetName()
    {
        var Name = _options.CurrentValue.UserName;
        return Name;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.Configure<AppOptions>(Configuration.GetSection("AppOptions"));
    services.AddSingleton<UserService>();
}

上記のUser Serviceはシングルトン注入であり、IOptionsMonitor Tを介して設定リアルタイムリフレッシュを実現することができ、IOptionsSnapshot Tが起動するとエラーが発生します。

1.4複数のプロファイル·ロードがリアルタイムに有効になる

dbプロファイルを1つ追加

Program.csのCreateHostBuilderを変更するか、ロード時にreloadOnChange trueを追加します。

public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                config.AddJsonFile("Configs/dbsetting.json", optional: true, reloadOnChange: true);
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });

使い方も同じです:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
    private readonly IConfiguration _configuration;
    private AppOptions _options;
    public HomeController(ILogger<HomeController> logger, IConfiguration configuration, IOptionsMonitor<AppOptions> appOptions)
    {
        _logger = logger;
        _configuration = configuration;
        _options = appOptions.CurrentValue;
    }

    public IActionResult Index()
    {
        string Name = _configuration["TestSetting"];
        string Name2 = _configuration["db:connection1"];
        ViewBag.Name = Name;
        ViewBag.Name2 = Name2;
        return View();
    }
}
Keep Exploring

延伸阅读

更多文章