多个配置文件得使用场景:
(1)实际开发中经常会把开发环境、测试环境、生产环境进行分离。比如数据库:有开发环境、测试环境、生产环境下的数据库,不同数据库的配置文件就不一样了。
(2)为了结构清晰,需要根据功能特点分离配置文件(log配置文件、数据库配置文件)
(3)引入第三方组件,单独增加配置文件
实例:
(1)直接在项目下创建database.json,其代码问价如下:
{
“database”: {
“Server”: “IP地址:1111”,
“Name”: “testdb”,
“UId”: “sa”,
“Password”: “123”
}
}
这时项目下就有2个(默认的appsetting.json、database.json)配置文件了,那么怎么知道去哪个配置文件读取配置信息呢?在系统启动时就应该要去做这件事(告知系统去读取哪个配置文件)。
(2)修改Program.cs文件——让框架知道去读取database.Json配置文件
即在Program.cs文件中增加以下代码
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config => {
config.AddJsonFile("database.json");
})
.UseStartup<Startup>()
.Build();
说明:通过ConfigureAppConfiguration方法处理, 参数类型为Action,即是参数要为IConfigurationBuilder类型的方法(这里用lambda表达式)。其本质是通过IConfigurationBuilder.AddJsonFile(file)
此时运行测试就是以读取database.json中的配置信息为主,但是当database.json文件中不存在需要读取的key时,还是会去读取默认配置文件appsetting.json文件中的配置信息。也就是说配置信息中相同的key是读取database.json中的。
此外,可以通过IConfigurationBuilder.AddJsonFile(file)添加多个配置文件,如下所示。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config => {
config.AddJsonFile("database.json");
config.AddJsonFile("db.json");//直接这样会报错,因为db.json文件不存在,可以config.AddJsonFile("db.json",true)
})
.UseStartup<Startup>()
.Build();
注意:多个配置文件中相同配置信息,后加入的配置文件会覆盖先前相同配置项。
实际开发中经常会把开发环境、测试环境、生产环境进行分离。比如数据库:有开发环境、测试环境、生产环境下的数据库,不同数据库的配置文件就不一样了。有人说在发布的时候直接在Program.cs文件中根据当前环境进行更改不同的配置文件不就可以了,当然这样没问题的,但是发布就不方便了,要根据当前的环境进行修改。那么如何处理呢?——首先把开发环境、测试环境、生产环境下的数据库配置文件按一定的规则命名,比如database.环境名称.json
(1)开启环境变量。在program.cs文件中增加下面黄色底纹代码
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(config => {
config.AddJsonFile("database.json");
config.AddJsonFile("db.json");
config.AddEnvironmentVariables();//实际上没有这句话也行,因为默认就是开启
})
.UseStartup<Startup>()
.Build();
(2)改进ConfigureAppConfiguration方法,换另外一个重载
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//改造调用ConfigureAppConfiguration带有2个参数的方法,第一个参数WebHostbuilderContext类型,它下面有个HostingEnvironment属性,而这个属性下面有EnvironmentName属性获取变量名
.ConfigureAppConfiguration((context,config) => {
config.AddJsonFile("database.json");
//config.AddJsonFile("db.json");
//config.AddEnvironmentVariables();
//获取环境变量名
string env = context.HostingEnvironment.EnvironmentName;
config.AddJsonFile($"database.{env}.json",true);//此时配置文件命名就有一定规范(database.环境变量名.json),true表示此配置文件不存在也不报错
})
.UseStartup<Startup>()
.Build();
开发环境下设置环境变量:
当前环境是development,所以就会加载database.developmet.json配置。
同一个配置文件下,有多个相同节配置信息的处理:假设系统中用到2个数据库,就要有2个数据库的配置信息,如下:
{
“database1”: {
“Server”: “IP地址:1111”,
“Name”: “testdb1”,
“UId”: “sa”,
“Password”: “123”
},
“database2”: {
“Server”: “IP地址:1111”,
“Name”: “testdb2”,
“UId”: “sa”,
“Password”: “123”
}
}
在startup.cs文件中,把配置映射到Database类,由于Database类的结构一样,所以不用去定义2个相同的类,因此,要把下面的配置节映射代码改掉绿色底纹所示。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Database>(Configuration.GetSection("database"));//把配置节中的database节映射到Database类
//第一个database相当于为此类映射信息取别名
services.Configure<Database>("database1",Configuration.GetSection("database1"));//把配置节中的database节映射到Database类
services.Configure<Database>("database2", Configuration.GetSection("database2"));
services.AddMvc();
}
那么在控制器中如何去获取到对应的配置信息呢(在此即为数据库连接信息),调用_database的Get方法去获取对应名称的数据库配置信息。
public IActionResult Index()
{
//Database db = _database.CurrentValue;
Database db = _database.Get("database1");
ViewBag.database = $"server:{db.Server},name:{db.Name}";
return View();
}
相关理论:
IServiceCollection.Configure支持给配置对象命名。
IOptionsSnapshot/IOptionsMonitor可以通过名字(借助Get方法)获取对应配置对象。IOptions类型不支持Get方法。