本篇只是从应用角度来说明asp.net core的选项模式,下一篇会从源码来分析 1、以前的方式以前我们使用web.config/app.config时是这样使用配置的 var count = ConfigurationManager.AppSettings["key"];
写["key"]操作麻烦,弱类型的还得自己转,后来有人做了封装 public static class ConfigHelper{ public static T Get<T>(string key){ return (T)ConfigurationManager.AppSettings[key]; }
稍微好了点,全能方式,系统任何地方都可以调用,但是没有组织,最好是为单独的模块定义一个类,比如为订单模块定义一个配置类 public static class OrderConfig{ public static int Opt1{ 这时我们在订单业务中随时都可以访问这个配置,且是强类型的
2、asp.net core中的选项模式asp.net core中把这种为小模块定义的配置类称为选项模式,我们把这个配置对象称为选项对象.微软为我们定义了一些类,这些类相互协作完成了以下任务:
再者选项模式跟依赖注入也没有必然的联系,原因跟上面一样,但是asp.net core提供的选项模式是建立在依赖注入基础上的。但又与我们通常理解的有所不同。通常我们是定义接口IA,实现类A,然后注册iocContainer.Register<IA,A>(); 然后在使用时通过构造函数或属性注入。所以你可能会认为我们为某个模块定义选项时需要定义一个选项类,再定义一个对应的什么接口。其实不需要,因为asp.net core为我们提供了相应的泛型类,具体的看下面部分的说明来理解 2.1、定义选项类public class CloudDiskOption{ public string AllowFileTypes{ get; set; }
2.2、定义选项对象如何赋值asp.net core允许我们自己来定义选项对象如何赋值,最简单的方式是使用委托,代码如下 public void ConfigureServices(IServiceCollection services)
{
services.Configure<CloudDiskOption>(c=> {
c.AllowSize = 1024;
c.AllowFileTypes = "jpg,zip,pdf,docx";
});
services.AddControllersWithViews();
}
这样将来我们在需要使用选项类时asp.net core的选项框架会使用这个委托来帮我们创建 但更常见的方式是使用asp.net core提供的配置 {
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"myoption": {
"allowFileTypes": "jpg,zip,pdf,docx",
"allowSize": "1024"
}
}
你会看到我故意将选项类名与这里的配置键myoption设置成不一样,且配置项的大小写也不对应,这些属于配置部分的内容,这里不多讲,下面修改我们的Startup类 public void ConfigureServices(IServiceCollection services)
{
services.Configure<CloudDiskOption>(Configuration.GetSection("myoption"));
services.AddControllersWithViews();
}
这样将来我们需要选项对象时系统会通过配置来创建选项对象
2.3、使用选项对象通常我们使用以来注入来获取选项对象,asp.net core为我们提供了几个泛型接口,个人理解的基本原则如下
网上有些文章说IOptionsMonitor<TOptions>是使用得最少的,我反而觉得它应该是最常用的 下面我们来看咋用,比如我们希望在controller中访问选项,通过构造函数注入 public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
CloudDiskOption myOption;
public HomeController(ILogger<HomeController> logger, IOptionsMonitor<CloudDiskOption> optionsMonitor)
{
_logger = logger;
optionsMonitor.OnChange((a,b)=>
{
//危险
});
this.myOption = optionsMonitor.CurrentValue;
}
这是你的controller对象的其他action就可以随便访问myOption了,可以尝试修改配置文件后观察变化 3、总结 从应用的角度来讲选项用起来还是非常简单方便的,两个步骤:1定义选项的如何赋值 2使用的地方通过相应的泛型接口注入 |
|