配置文件的使用

1、如何添加及读取配置文件信息

一个项目的配置可以写在文件、内存或数据库等里面。默认配置文件appsettings.json,这是json格式数据(当然也可以是INI和XML)。
为了不影响本项目,我们建立一个测试项目(AppingSettingReadDemo),也为.Net Core MVC项目。

1.如何添加配置信息(往原有的appsettings.json文件中写)

,
  "option1": "value1",//最简单键——值对格式
"option2": {
      "suboption2": {
          "subkey1": "subvalue1",
          "subkey2": "subvalue2"
     }
  },  "database": { //键——对象格式
    "Server": "IP地址:port",
    "Name": "DBTest",
    "UId": "sa",
    "Password": "123456"
  },
  "students": [//数组格式
    {
      "Name": "张三",
      "Age": "20"
    },
    {
      "Name": "李四",
      "Age": "21"
    }
  ]

2.如何读取配置信息

IConfiguration:是有关配置文件最底层的一个接口类型,要获取配置信息就要通过这个类型对象。
(1)弱类型读取方式
切换到HomeController。
如何获取IConfiguration对象呢?——依赖注入,通过构造方法依赖注入。
通过构造方法怎么就能注入对象呢??这就是因为.Net Core内置了依赖注入,这里我们只告诉了configuration为IConfiguration类型,那么.Net Core内置DI就会自动去调用IConfiguration实现类的构造方法生成实例对象configuration。
DI——负责实例化应用程序中的对象及建立这些对象之间的依赖;维护对象之间的生命周期。

private IConfiguration Configuration;
        //通过构造函数注入Configuration对象
        public HomeController(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IActionResult Index()//这个地方不能有IConfiguration configuration参数的
        {
            string str1 = Configuration["option1"];
            string str2 = Configuration["database:Name"];
            string str3 = Configuration["option2:suboption2:subkey2"];
            string str4Name = Configuration["students:0:Name"];//读取数组,此处0表示数组的第1项
            string str4Age = Configuration["students:0:Age"];
            string str5Name = Configuration["students:1:Name"];//读取数组,此处1表示数组的第2项
            ViewBag.Value1 = str1;
            ViewBag.Value2 = str2;
            ViewBag.Value3 = str3;
            ViewBag.Name1 = str4Name;
            ViewBag.Age1 = str4Age;
            ViewBag.Name2 = str5Name;
            return View();
        }

前端Index.cshtml

@{
    ViewData["Title"] = "Home Page";
}
@ViewBag.Value1
@ViewBag.Value2
@ViewBag.Value3
@ViewBag.Name1
@ViewBag.Age1
@ViewBag.Name2
<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

配置文件的使用
如果中文出现乱码,解决方案——把配置文件appsetting.json重新以UTF-8编码保存。具体操作如下:
选择appsetting.json文件|文件|appsetting另存为,弹出对话框如下对话框,单击【编码保存】,弹出对话框,选择UTF-8编码,如下图所示。单击【确定】保存即可。
配置文件的使用
配置文件的使用
(2)强类型配置
假设要获取前面database节配置信息。
第一步:创建配置映射类(先新建一个Configs文件夹),然后创建一个类,比如Database.cs,定义类中的属性与配置节的key对应。
配置文件的使用
第二步:注入服务(Database.cs类)。在Startup.cs中把Database类与配置文件中的databse配置节建立关联

public void ConfigureServices(IServiceCollection services)
        {
      
            //把配置文件中的database配置节映射到Database类     
            services.Configure<Database>(Configuration.GetSection("database"));
}

源码中可以看出在Startup.cs中,Configuration也是通过构造方法注入的。
配置文件的使用
第三步:强类型配置方式如何去使用呢?——注入IOptions类型对象,同样通过构造函数注入

private IConfiguration Configuration;
        private IOptions<Database> _database;
        //通过构造函数注入Configuration对象
        public HomeController(IConfiguration configuration, IOptions<Database> database)
        {
            Configuration = configuration;
            _database = database;
        }
public IActionResult Index()//这个地方不能有IConfiguration configuration参数的
        {
         
            Database db = _database.Value;//通过注入对象的Value属性得到Database实例对象
            ViewBag.database= $"server:{db.Server},name:{db.Name}";//然后就可以通过映射类Database类的实例对象获取其属性值。此处采用占位符写法,前面的$符号不能少
          
            return View();
        }

思考以下几个问题:
1、程序运行期间,如果配置文件发生了变化,程序会自动加载新的配置吗?
目前是不能的。因为IOptions类型对象为单例模式,即程序一单运行起来,实例化后的对象就唯一。
把IOptions改为IOptionsSnapshot类型即可(上面黄色底纹的2处需要修改),属于Scoped类型服务,针对每次请求都会重新加载配置数据(所以每次都会读取配置文件信息)。
测试:只要修改了配置文件appsetting.json中的信息,比如修改端口号,刷新下页面,即看到改变后的结果——ok
2、每次加载都会重新读取配置文件,没有变化时也是这样的,这样会导致无用操作,能不能只在配置文件发生变化时才加载呢?
把IOptionsSnapshot改为IOptionsMonitor类型,该类型能自动监控配置文件的变化,自动加载最新配置。
此时_database. Value替换为_database.CurrentValue;因为这时不存在value属性。

上一篇:redis-cache中的callback


下一篇:第7篇英语翻译