• 第四十三节:再探配置系统(多个appsettings.json/环境/各种读取方式)、机密文件、选项模式


    一. 复习

    1. appsettings.json 和 appsettings.{Environment}.json

      在开发环境中,appsettings.Development.json 配置会覆盖在 appsettings.json 中找到的值,如果读取的key在Development文件中没有,则去appsettings.json中读取

      在生产环境中,appsettings.Production.json 配置会覆盖在 appsettings.json 中找到的值,如果读取的key在Production文件中没有,则去appsettings.json中读取

    测试:

      A. 开发环境中的结果: userPwd: ypf001_Development,userGender: man

      B. 生产环境中的结果:   userPwd: ypf001_Production,userGender: man

    代码分享:

            /// <summary>
            /// 测试appsettings各种变种
            /// </summary>
            /// <returns></returns>
            [HttpPost]
            public string TestAppsettings()
            {
                string userPwd = Configuration["userPwd"];
                string userGender= Configuration["userGender"];
                return $"userPwd:{userPwd},userGender:{userGender}";
            }

    2. 判断生产、开发、测试、自定义环境

      ASP.NET Core 在应用启动时读取环境变量 ASPNETCORE_ENVIRONMENT, ASPNETCORE_ENVIRONMENT 可设置为任意值,但框架仅支持三个值:Development(开发)、Staging(测试)和 Production(生产)。 如果未设置 ASPNETCORE_ENVIRONMENT,则默认为 Production(即生产环境)。

     (1). 在program文件中

       app.Environment.IsDevelopment()

     (2). 在action中

       注入:[FromServices] IHostEnvironment evn,然后 evn.IsDevelopment()

    还有其它方法:

                    开发环境:evn.IsDevelopment()

                    测试环境:evn.IsStaging()

                    生产环境:evn.IsProduction()

                    自定义环境:evn.IsEnvironment("ypf")

    PS:如何手动修改环境变量 ASPNETCORE_ENVIRONMENT ,详见 https://www.cnblogs.com/yaopengfei/p/10904178.html

    代码分享:

            /// <summary>
            /// 测试环境的读取
            /// </summary>
            /// <param name="evn"></param>
            /// <returns></returns>
            [HttpPost]
            public string TestEnvironment([FromServices] IHostEnvironment evn)
            {
                string msg = $"是开发环境:{evn.IsDevelopment()}," +
                    $"是测试环境:{evn.IsStaging()}," +
                    $"是生产环境:{evn.IsProduction()}," +
                    $"是自定义环境:{evn.IsEnvironment("ypf")}";
                return msg;
            }

    二. 配置系统

    1. 如何使用

      (默认已经加载了appsettings.json、appsettings.Development.json、appsettings.Production.json文件)

     (1). 控制器中

         注入 IConfiguration configuration,使用即可

     (2). Program.cs文件中

      var builder = WebApplication.CreateBuilder(args);  然后使用builder.Configuration["userPwd"] 即可

    关于多层的读取规则参考之前文章:https://www.cnblogs.com/yaopengfei/p/10975759.html

    program中代码分享:

    //读取配置文件
    Console.WriteLine("测试读取配置文件:" + builder.Configuration["userPwd"]);
    Console.WriteLine("测试用法方法配置文件:" + builder.Configuration.GetValue<string>("userPwd"));
    Console.WriteLine("读取用户机密文件:" + builder.Configuration["testUserSecret"]);

    2. 方法和绑定

    (1). 常用方法: GetValue<T>、GetSection、GetChildren、Exits

    (2). 绑定:读取配置文件的内容绑定到一个类上,通过GetSection+Bind实现 (详见下面选项模式的代码实操)

    详细用法参考之前的文章:https://www.cnblogs.com/yaopengfei/p/10975759.html

    3. 其它文件

      (比如其它json文件、xml文件、ini文件等)

     需要在Program中进行注册一下,先设置当前目录,然后通过AddJsonFile、AddXmlFile加载进来即可

     注意:这些配置文件的属性都要改为始终复制

    注册代码分享

    //注册其它配置文件
    //1. 设置当前目录为基础目录(后面则可以用相对路径)
    builder.Configuration.SetBasePath(Directory.GetCurrentDirectory());
    //2.加载json文件 (配置后面两个参数为true,当配置文件发生变化的时候,会自动更新加载,而不必重启整个项目)
    builder.Configuration.AddJsonFile("MyConfig/ypf1.json", optional: true, reloadOnChange: true);
    //3.加载xml文件
    builder.Configuration.AddXmlFile("MyConfig/ypf2.xml");

    读取代码

            /// <summary>
            /// 测试读取其它配置文件
            /// </summary>
            /// <returns></returns>
            [HttpGet]
            public string TestOtherConfig()
            {
                string schoolName = Configuration["schoolName"];
                string k0content = Configuration["section0:key0"];
                return $"ypf1.json中读取的内容为:{schoolName},ypf2.xml中读取的内容为:{k0content}";
            } 

    三. 机密文件

    详细用法见之前文章:https://www.cnblogs.com/yaopengfei/p/12129746.html

    EFCore链接字符串写入机密程序中:https://www.cnblogs.com/yaopengfei/p/11633385.html    

    用法:

       (1). 选中项目右键→管理用户机密,则 生成 或 打开机密文件

       (2). xxx.csporj中的 <UserSecretsId>4a888c0c-6db9-4db6-b971-882f7609c643</UserSecretsId>,表示机密文件对应磁盘文件夹名称

       (3). 磁盘文件夹路径  %APPDATA%\microsoft\UserSecrets\

    结论:当appsetting.json 和 机密文件中都有这个字符串,优先读取的是机密文件

    四. 选项模式

    1. 含义

      选项模式使用类来提供对相关设置组的强类型访问

    2. 选项类

     A.必须是包含公共无参数构造函数的非抽象类。

     B.类型的所有公共读写属性都已绑定。

     C.字段不是绑定的

    3. 实操

     写法1:GetSection+Bind方法

       项目启动后,json文件修改,那么读取的是修改后的文件

     写法2:GetSection+Get方法 【更加简介】

       项目启动后,json文件修改,那么读取的是修改后的文件

     写法3:

      A. 现在Program文件中注册

      B. 在控制器中通过IOptions<UserInfo> userInfo进行注入

    注:这种写法项目启动后,无法读取修改后的json文件,如果想读取修改后的,需要使用IOptionsSnapshot

    (详见官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/options?view=aspnetcore-6.0)

    类代码

      public class UserInfo
        {
            public string id { get; set; }
            public string name { get; set; }
        }

    配置文件代码

    {
        //测试选项模式
        "UserInfo": {
            "id": "001",
            "name": "ypf"
        }
    }

    选项模式注册代码(program.cs)

    var builder = WebApplication.CreateBuilder(args);
    //注册选项模式类
    builder.Services.Configure<UserInfo>(builder.Configuration.GetSection("UserInfo"));

    最终读取代码

            private readonly IConfiguration Configuration;
            private readonly UserInfo _user;
            public Test1Controller(IConfiguration configuration,IOptions<UserInfo> userInfo)
            {
                Configuration = configuration;
                _user = userInfo.Value;
            }
     
           /// <summary>
            /// 测试选项模式
            /// </summary>
            /// <returns></returns>
            [HttpPost]
            public string TestChooseMode([FromService])
            {
                string msg = "";
                //写法1
                {
                    UserInfo userInfo = new UserInfo();
                    Configuration.GetSection("UserInfo").Bind(userInfo);
                    msg = $"id为:{userInfo.id},name为:{userInfo.name}";
                }
                //写法2
                {
                    UserInfo userInfo = Configuration.GetSection("UserInfo").Get<UserInfo>();
                    msg = $"id为:{userInfo.id},name为:{userInfo.name}";
                }
                //写法3
                {
                    msg = $"id为:{_user.id},name为:{_user.name}";
                }
                return msg;
            } 

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    ES6常用语法
    nodejs中exports与module.exports的区别
    CSS animation动画
    CSS user-select文本是否可复制
    VUE 滚动插件(better-scroll)
    VUE 父组件与子组件交互
    CSS div内文字显示两行,超出部分省略号显示
    linux下使用tar命令
    linux fdisk命令使用
    关于SUID、SGID、Sticky
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/16304254.html
Copyright © 2020-2023  润新知