首页 >> 大全

ASP.NET Core - 选项系统之选项使用

2023-12-21 大全 35 作者:考证青年

1.

public class OptionController : ControllerBase
{private readonly BlogOptions _blogOptions;public OptionController(IOptions options){// 通过 IOptions 接口的 Value 属性读取选项类// 选项类始终是程序启动时加载的值,不会改变_blogOptions = options.Value;}
}

2.

public class OptionController : ControllerBase
{private readonly BlogOptions _blogOptions;public OptionController(IOptionsSnapshot optionsSnapshot){// IOptionsSnapshot 可以通过 Value 属性读取默认的命名的选项类, Options 对象实例创建时读取的配置快照_blogOptions = optionsSnapshot.Value;// 也可以通过 Get 方法获取某一个命名选项,没有指定命名时,默认命名为 string.Empty//_blogOptions = optionsSnapshot.Get(string.Empty);}
}

3.

public class OptionController : ControllerBase
{private readonly BlogOptions _blogOptions;public OptionController(IOptionsMonitor optionsMonitor){// IOptionsMonitor 接口没有 Value 属性,通过 CurrentValue 获取选项类对象,// 每次调用 CurrentValue都会实时读取配置源,始终是最新配置的值_blogOptions = optionsMonitor.CurrentValue;// 该接口也支持通过 Get 方法获取命名选项_blogOptions = optionsMonitor.Get(string.Empty);// 可以通过 OnChange 注册事件,当配置被加载时会触发事件optionsMonitor.OnChange(OnOptionsChange);}[HttpGet]public Task Get(){return Task.FromResult(_blogOptions);}private void OnOptionsChange(BlogOptions options){Console.WriteLine(JsonSerializer.Serialize(options));}
}

启动应用,调用一次 Get 接口,在 Api 控制器构造函数中注册了配置加载触发事件,之后修改 .json 配置文件中选项类对于的配置节点内容,可以看到事件触发,控制台中输出了改变之后的选项类内容。

4. 三个接口的选项读取机制演示

三个接口解析的选项类的差别,可以通过以下测试清楚得看出:

配置文件中初始选项节点如下:

"Blog": {"Title": "ASP.NET Core Options11","Content": "This is a blog about Options System in ASP.NET Core Framework.","CreateTime": "2022-12-06"
}

这里为了方便看出 生命周期 接口的变化,所有通过 Web Api 接口来测试

public class OptionController : ControllerBase
{private readonly IOptions _blogOptions;private readonly IOptionsSnapshot _blogSnapshotOptions;private readonly IOptionsMonitor _blogMonitorOptions;public OptionController(IOptions options,IOptionsSnapshot optionsSnapshot,IOptionsMonitor optionsMonitor){
// 注意这里不能再把选项类对象先读取出来,否则选项类对象也不会再改变了_blogOptions = options;_blogSnapshotOptions = optionsSnapshot;_blogMonitorOptions = optionsMonitor;}[HttpGet]public Task Get(){Console.WriteLine("第一次读取配置:");Console.WriteLine("IOptions:" + JsonSerializer.Serialize(_blogOptions.Value));Console.WriteLine("IOptionsSnapshot:" + JsonSerializer.Serialize(_blogSnapshotOptions.Value));Console.WriteLine("IOptionsMonitor:" + JsonSerializer.Serialize(_blogMonitorOptions.CurrentValue));Console.WriteLine("请修改配置文件!");Console.ReadKey();Console.WriteLine("第二次读取配置:");Console.WriteLine("IOptions:" + JsonSerializer.Serialize(_blogOptions.Value));Console.WriteLine("IOptionsSnapshot:" + JsonSerializer.Serialize(_blogSnapshotOptions.Value));Console.WriteLine("IOptionsMonitor:" + JsonSerializer.Serialize(_blogMonitorOptions.CurrentValue));return Task.CompletedTask;}
}

之后启动应用调用 Get 接口,并在过程中将配置文件内容修改为以下:

_选择所属系统_选择系统

"Blog": {"Title": "ASP.NET Core Options222","Content": "This is a blog about Options System in ASP.NET Core Framework.","CreateTime": "2022-12-06"
}

可以看到控制台的输出中,第二次读取配置的时候,接口读取到的内容已经改变

之后不要关闭应用,再调一次 Get 接口,并在过程中再次修改配置如下:

"Blog": {"Title": "ASP.NET Core Options333","Content": "This is a blog about Options System in ASP.NET Core Framework.","CreateTime": "2022-12-06"
}

这一次的 Get 请求的输出结果如下:

可以看到 接口每次都能获取到配置文件的实时值,接口相较于第一次调用 Get 接口的时候已经改变,获取到了之前修改的值,但是之后的修改它又获取不到了,因为它是 生命周期,在一次请求内是保持一致的,而 接口获取到的选项类对象是一致不变的。

tags: 接口

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了