【问题标题】:no need of recompile when configuration changes in ASP.NET CoreASP.NET Core 中配置更改时无需重新编译
【发布时间】:2019-04-02 06:50:29
【问题描述】:

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

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

它还说当使用 IOptions 接口的强类型设置时:

将 DI 容器中的 IOptions 接口注册为单例,最终绑定的 POCO 对象在 Value 属性中。

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

【问题讨论】:

  • @John 但 IOptions .Value 也是单例的。应用程序如何不重新编译以创建 IOptions 的新实例以反映最新更改?

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


【解决方案1】:

如果您使用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
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 1970-01-01
    • 2017-10-20
    • 2019-02-02
    • 2018-04-10
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多