首页 > 其他分享 >.Net 配置绑定 IOptions

.Net 配置绑定 IOptions

时间:2022-12-05 14:58:46浏览次数:51  
标签:配置 StudentSettings IOptionsMonitor 绑定 IOptions services Net public studentSettin

准备

  首先准备下appsettins.json以及目标类

  appsettins.json

"StudentSettings": {
    "Id": 1023,
    "Name": "Development"
  }

 

  创建实体类

public class StudentSettings
{
    public int Id { get; set; }

    public string Name { get; set; }
}

 

 

绑定

//方式1
Configuration.GetSection(nameof(StudentSettings)).Bind(new StudentSettings());
//方式2
Configuration.GetSection(nameof(StudentSettings)).Get<StudentSettings>();
//方式3
  services.Configure<StudentSettings>(Configuration.GetSection(nameof(StudentSettings)));

 

 

获取配置

  使用IOptions接收注入的Options类,即可获取配置

public class TestController
{
    private readonly IOptionsMonitor<StudentSettings> _studentSettings;

    public TestController(IOptionsMonitor<StudentSettings> studentSettings)
    {
        _studentSettings = studentSettings;
    }

    [HttpGet("~/test")]
    public async Task<IActionResult> Test()
    {
        Console.WriteLine(_studentSettings.CurrentValue.Id);
        await Task.Delay(5000);
        Console.WriteLine(_studentSettings.CurrentValue.Name);

        return Ok();
    }
}

 

 

配置操作类接口

IOptions<TOptions>

  • 注册的实例为单例,可以注入到任何服务生存期;
  • 不支持在应用启动后读取配置数据,既修改配置后不会自动更新到已启动的程序;

IOptionsSnapshot<IOptions>

  • 注册为Scope,无法注入到单例;
  • 由于注册为Scope,每次请求重新加载配置,配置修改后下个请求就能更新配置项;

IOptiionsMonitor<IOptions>

  • 注册为单例,可以注入到任何服务生存期;

  • 配置修改可以会重新加载配置,获取新值

 

 

Test

查看代码
private readonly IOptionsMonitor<StudentSettings> _studentSettings;
//private readonly StudentSettings _studentSettings1;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
                                 IOptionsMonitor<StudentSettings> studentSettings, 
                                 //IOptionsSnapshot<StudentSettings> studentSettings,
                                 //IOptionsSnapshot<StudentSettings> studentSettings,
                                 )
{
  _logger = logger;
  _studentSettings = studentSettings;
  //_studentSettings1 = studentSettings.Val;
}

[HttpGet("~/test")]
public async Task<IActionResult> Test()
{
    Console.WriteLine(_studentSettings.CurrentValue.Id);
    //Console.WriteLine(_studentSettings1.Id);
    await Task.Delay(5000);//留下时间修改appsetting.json配置
    Console.WriteLine(_studentSettings.CurrentValue.Name);//IOptionsMonitor配置发生更改时就可以获取新值,如果在构造函数就获取Val则获取不到新值
    //Console.WriteLine(_studentSettings1.Name);
    return Ok();
}

  在delay的时候如果使用的是IOptiionsMonitor,配置一改就会更新StudentSettings

  如果使用的是IOptionsSnapshot,StudentSettings在当前请求都不会变,直到下个请求

  IOptions在程序启动时是什么值就一直是什么值,直到项目重启

 

 

 IOptionsMonitor源码

  OptionsMonitor注册为单例却能实时更新是由于IOptionsChangeTokenSource<TOptions>,它引用了代表配置文件的对象config,所以配置文件更新会被ConfigurationChangeTokenSource监听到,IOptionsMonitor就会跟着更新;

public OptionsMonitor(IOptionsFactory<TOptions> factory, IEnumerable<IOptionsChangeTokenSource<TOptions>> sources, IOptionsMonitorCache<TOptions> cache)
{
    _factory = factory;
    _sources = sources;
    _cache = cache;

    foreach (var source in _sources)
    {
        var registration = ChangeToken.OnChange(
                () => source.GetChangeToken(),
                (name) => InvokeChanged(name),
                source.Name);

        _registrations.Add(registration);
    }
}

//Microsoft.Extensions.Options.ConfigurationExtensions.dll

public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config, Action<BinderOptions> configureBinder)
    where TOptions : class
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    if (config == null)
    {
        throw new ArgumentNullException(nameof(config));
    }

    services.AddOptions();
    services.AddSingleton<IOptionsChangeTokenSource<TOptions>>(new ConfigurationChangeTokenSource<TOptions>(name, config));
    return services.AddSingleton<IConfigureOptions<TOptions>>(new NamedConfigureFromConfigurationOptions<TOptions>(name, config, configureBinder));
}

 

标签:配置,StudentSettings,IOptionsMonitor,绑定,IOptions,services,Net,public,studentSettin
From: https://www.cnblogs.com/zousc/p/16952245.html

相关文章

  • Kubernetes(K8S) helm chart
    感觉和放到一个yaml文件中,用----分隔,操作繁琐程度上,没有太大区别创建自定义Chart#创建自定义的chart名为mychart[root@k8smaster~]#helmcreatemychartCre......
  • Windows Server部署.net Core应用
    安装.netcorewindowserverhosting重启IISiisreset参考文档:​​​https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetcore2x​​​​​https:......
  • PageOffice .NET 记一次使用
    1.根据官方文档,先将Css和js引用到你的项目中(好像5.0以上的版本都不需要引用了,可以试一下),放置一个合适的位置。我是直接把SimpleWord整个文件夹直接引用了, 2.然后再配置......
  • 在asp.net 2.0中的web.config文件中调用外部文件
    在一个工作项目或者工作小组中,有可能经常要转换工作的调试环境,比如开发环境,测试环境,部署环境,这样有可能要对web.config文件进行修改或改动,比如......
  • asp.net 2.0中新增的web.config的默认namespace功能
    看上去这个题目比较长,但实际上,我在看资料时发现,这就是说,在asp.net2.0中,只需要在web.config里定义你要用的那些namespace,则在aspx页面中就不需要再象1.1那样,用<%@im......
  • 第二章:创建你的第一个应用程序(ASP.NET Core in Action)
    本章要点创建第一个ASP.NETCoreweb应用程序运行应用程序了解应用程序的组件 读完第1章后,您应该对ASP.NETCore应用程序的工作原理以及何时使用它们有了大致的了解......
  • imagenet数据集的归一化参数
    前处理归一化,mobilenet的归一化参数如下,这些奇奇怪怪的数字是怎么来的呢? 这是imagenet数据集的标准的均值和方差,Imagenet数据集的均值和方差为:mean=(0.485,0.456,0.406),s......
  • 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
    ​​DARKNET中使用的缩放算法是双线性内插值法,这里就实际验证一把DARKNET中scale的工作原理与效果:首先这是一张原图,画面中的是南京明城墙玄武门,玄武湖的正门。18年国庆带娃......
  • ASP.NET Core 配置跨域(CORS)
    ASP.NETCore配置跨域(CORS)1.安装程序CORS程序包Install-PackageMicrosoft.AspNetCore.Mvc.Cors一般默认都带了此程序包的2.配置CORS服务在Startup类,ConfigureServi......
  • .NET读取QQWry.Dat 纯真版ip数据库格式数据源
    外部调用://测试地址搜索#region测试地址搜索IPScanerobjScan=newIPScaner();stringip=Request.UserHostAddress.ToString();objScan.DataPath=@"......