谈谈.NET CORE中如何添加及读取配置文件信息

.ASP.NET CORE 中默认的配置文件是appsettings.json,为了说明如何进行配置以及使用,现在建立如下文件。

1.添加配置信息

"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.如何进行配置?

Configuration:是有关配置文件最底层的一个接口类型,要获取配置信息就要通过这个类型对象

1)弱类型读取方式

切换到HomeController。

如何获取IConfiguration对象呢?——依赖注入通过构造方法依赖注入

通过构造方法怎么就能注入对象呢??这就是因为.Net Core内置了依赖注入这里我们只告诉了configuration为IConfiguration类型那么.Net Core内置DI就会自动去调用IConfiguration实现类的构造方法生成实例对象configuration

DI——负责实例化应用程序中的对象建立这些对象之间的依赖维护对象之间的生命周期

有关依赖注入的深层次理解请参考我的这篇文章:谈谈.NET CORE 核心概念:深入理解依赖注入https://blog.csdn.net/weixin_41372626/article/details/104968353

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();
        }

前端代码:

@{

    ViewData["Title"] = "Home Page";

}

@ViewBag.Value1

@ViewBag.Value2

@ViewBag.Value3

@ViewBag.Name1

@ViewBag.Age1

@ViewBag.Name2



    Welcome

    

Learn about building Web apps with ASP.NET Core.

运行结果:

谈谈.NET CORE中如何添加及读取配置文件信息_第1张图片

如果中文出现乱码,解决方案——把配置文件appsetting.json重新以UTF-8编码保存。具体操作如下:

选择appsetting.json文件|文件|appsetting另存为,弹出对话框如下对话框,单击【编码保存】,弹出对话框,选择UTF-8编码,如下图所示。单击【确定】保存即可。

谈谈.NET CORE中如何添加及读取配置文件信息_第2张图片

谈谈.NET CORE中如何添加及读取配置文件信息_第3张图片

(2)强类型配置

假设要获取前面database节配置信息。

第一步:创建配置映射类(先新建一个Configs文件夹),然后创建一个类,比如Database.cs,定义类中的属性与配置节的key对应。

谈谈.NET CORE中如何添加及读取配置文件信息_第4张图片

第二步:注入服务(Database.cs类)。在Startup.cs中把Database类与配置文件中的databse配置节建立关联

public void ConfigureServices(IServiceCollection services)

        {

          ……

            //把配置文件中的database配置节映射到Database     services.Configure(Configuration.GetSection("database"));

……

}

源码中可以看出在Startup.cs中,Configuration也是通过构造方法注入的。

谈谈.NET CORE中如何添加及读取配置文件信息_第5张图片

第三步:强类型配置方式如何去使用呢?——注入IOptions类型对象,同样通过构造函数注入

private IConfiguration Configuration;
        private IOptions _database;
        //通过构造函数注入Configuration对象
        public HomeController(IConfiguration configuration, IOptions 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();
        }

前端添加@ViewBag. database测试效果,OK

思考以下几个问题

1、程序运行期间,如果配置文件发生了变化,程序会自动加载新的配置吗?

目前是不能的。因为IOptions类型对象为单例模式,即程序一单运行起来,实例化后的对象就唯一。

如何解决呢?

IOptions改为IOptionsSnapshot类型即可,属于Scoped类型服务,针对每次请求都会重新加载配置数据(所以每次都会读取配置文件信息)。

测试:只要修改了配置文件appsetting.json中的信息,比如修改端口号,刷新下页面,即看到改变后的结果——ok

2、每次加载都会重新读取配置文件,没有变化时也是这样的,这样会导致无用操作,能不能只在配置文件发生变化时才加载呢

把IOptionsSnapshot改为IOptionsMonitor类型该类型能自动监控配置文件的变化自动加载最新配置

此时_database. Value替换为_database.CurrentValue;因为这时不存在value属性

你可能感兴趣的:(笔记)