多配置文件的用法

多个配置文件得使用场景:
(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方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值