ASP.NET Core中的配置更改时无需重新编译

时间:2019-04-02 06:50:30

标签: c# .net asp.net-mvc asp.net-core

我是ASP.NET Core的初学者,我正在读一本书,上面写着:

  

在ASP.NET Core中,您终于可以编辑文件并自动更新应用程序的配置,   无需重新编译或重新启动。

并且它还说,在IOptions接口中使用强类型设置时:

  

将IOptions接口作为一个单例注册到DI容器中,并将最终绑定的POCO对象置于Value属性中。

所以这是我的问题,如果IOptions的实现是单例的,这意味着该应用程序将始终获得相同的服务实例。如果是这样,当配置文件更改时,该应用程序如何无需重新编译以反映最新更改? (如果IOptions是singleton,则POCO对象也总是相同的)

1 个答案:

答案 0 :(得分:0)

如果使用IOptions<T>界面,则Value属性将始终返回配置期间设置的相同值。为了在每次更改文件时获取更新的值,您应该插入IOptionsMonitor<T>IOptionsSnapshot<T>接口。

Startup.cs

services.Configure<SomeOptions>(Configuration.GetSection("ConfigSection"));

TestController.cs (带有IOptions

public class TestController : Controller
{
    private readonly IOptions<SomeOptions> _options;

    public TestController(IOptions<SomeOptions> options)
    {
        _options = options;
    }

    [HttpGet]
    public async Task<IActionResult> GetConfig()
    {
        return Json(_options.Value); //returns same value every time
    }
}

TestController.cs (带有IOptionsMonitor

public class TestController : Controller
{
    private readonly IOptionsMonitor<SomeOptions> _options;

    public TestController(IOptionsMonitor<SomeOptions> options)
    {
        _options = options;
    }

    [HttpGet]
    public async Task<IActionResult> GetConfig()
    {
        return Json(_options.CurrentValue); //returns recalculated value
    }
}