.ASP.NET CORE 中默认的配置文件是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"
}
]
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.
运行结果:
如果中文出现乱码,解决方案——把配置文件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
……
}
源码中可以看出在Startup.cs中,Configuration也是通过构造方法注入的。
第三步:强类型配置方式如何去使用呢?——注入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
测试:只要修改了配置文件appsetting.json中的信息,比如修改端口号,刷新下页面,即看到改变后的结果——ok
2、每次加载都会重新读取配置文件,没有变化时也是这样的,这样会导致无用操作,能不能只在配置文件发生变化时才加载呢?
把IOptionsSnapshot
此时_database. Value替换为_database.CurrentValue;因为这时不存在value属性。