zoukankan      html  css  js  c++  java
  • 【APS.NET Core】- Json配置文件的读取

    在项目目录下有个 appsettings.json ,我们先来操作这个文件。在appsettings.json中添加以下内容:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "FormatOptions": {
        "DateTime": {
          "LongDatePattern": "dddd, MMMM d, yyyy",
          "LongTimePattern": "h:mm:ss tt",
          "ShortDatePattern": "M/d/yyyy",
          "ShortTimePattern": "h:mm tt"
        },
        "CurrencyDecimal": {
          "Digits": 2,
          "Symbol": "$"
        }
      }
    }

    现在我们的目的是读取红色部分的配置信息。

    新建配置类

    为了读取该文件,我们建立一个类:

        public class FormatOptions
        {
            public DateTimeFormatOptions DateTime { get; set; }
            public CurrencyDecimalFormatOptions CurrencyDecimal { get; set; }
    
            public FormatOptions(IConfiguration config)
            {
                this.DateTime = new DateTimeFormatOptions(config.GetSection("DateTime"));
                this.CurrencyDecimal = new CurrencyDecimalFormatOptions(config.GetSection("CurrencyDecimal"));
            }
    
            public class DateTimeFormatOptions
            {
                public string LongDatePattern { get; set; }
                public string LongTimePattern { get; set; }
                public string ShortDatePattern { get; set; }
                public string ShortTimePattern { get; set; }
    
                //其他成员
                public DateTimeFormatOptions(IConfiguration config)
                {
                    this.LongDatePattern = config["LongDatePattern"];
                    this.LongTimePattern = config["LongTimePattern"];
                    this.ShortDatePattern = config["ShortDatePattern"];
                    this.ShortTimePattern = config["ShortTimePattern"];
                }
            }
    
            public class CurrencyDecimalFormatOptions
            {
                public int Digits { get; set; }
                public string Symbol { get; set; }
    
                public CurrencyDecimalFormatOptions(IConfiguration config)
                {
                    this.Digits = int.Parse(config["Digits"]);
                    this.Symbol = config["Symbol"];
                }
            }
        }

    字段与配置文件中一样。

    在Startup中读取

    在Startup的ConfigureServices方法中添加如下代码:

    // This method gets called by the runtime. Use this method to add services to the container.
            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
    
                //IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("").Build();
                //services.Configure<KestrelServerOptions>(configuration);
    
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddRazorPagesOptions(options=> 
                {
                    options.RootDirectory = "/Pages";
                    
                });
    
                services.AddOptions();
                services.Configure<FormatOptions>(Configuration.GetSection("FormatOptions"));
            }

    将配置文件的"FormatOptions"节点注册到类FormatOptions。借助于Options Pattern的自动绑定机制,我们无需逐条地读取配置,所以我们可以将这个三个Options类型(DateTimeFormatOptions、CurrencyDecimalOptions和FormatOptions)的构造函数全部删除,只保留其属性成员。变成:

        public class FormatOptions
        {
            public DateTimeFormatOptions DateTime { get; set; }
            public CurrencyDecimalFormatOptions CurrencyDecimal { get; set; }
    
            //public FormatOptions(IConfiguration config)
            //{
            //    this.DateTime = new DateTimeFormatOptions(config.GetSection("DateTime"));
            //    this.CurrencyDecimal = new CurrencyDecimalFormatOptions(config.GetSection("CurrencyDecimal"));
            //}
    
            public class DateTimeFormatOptions
            {
                public string LongDatePattern { get; set; }
                public string LongTimePattern { get; set; }
                public string ShortDatePattern { get; set; }
                public string ShortTimePattern { get; set; }
    
                //其他成员
                //public DateTimeFormatOptions(IConfiguration config)
                //{
                //    this.LongDatePattern = config["LongDatePattern"];
                //    this.LongTimePattern = config["LongTimePattern"];
                //    this.ShortDatePattern = config["ShortDatePattern"];
                //    this.ShortTimePattern = config["ShortTimePattern"];
                //}
            }
    
            public class CurrencyDecimalFormatOptions
            {
                public int Digits { get; set; }
                public string Symbol { get; set; }
    
                //public CurrencyDecimalFormatOptions(IConfiguration config)
                //{
                //    this.Digits = int.Parse(config["Digits"]);
                //    this.Symbol = config["Symbol"];
                //}
            }
        }

    在PageModel中使用:

        public class ContactModel : PageModel
        {
            public string Message { get; set; }
            public FormatOptions Options { get; set; }
    
            public ContactModel(IOptions<FormatOptions> option)
            {
                this.Options = option.Value;
            }
    
            public void OnGet()
            {
                Message = "Your contact page.";
    
                IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
                this.Options = new ServiceCollection()
                          .AddOptions()
                          .Configure<FormatOptions>(config.GetSection("FormatOptions"))
                          .BuildServiceProvider()
                          .GetService<IOptions<FormatOptions>>()
                          .Value;
            }
        }

    上述代码的绿色部分是另一种读取方式,这种方式直接使用构造函数的方式读取,而不是使用.net core的依赖注入。

     类库中读取配置文件

    为了统一管理配置文件的读取,我们大部分情况是需要在一个基础类库实现对配置文件的读取。所以封装了如下的类:

    public class ConfigurationManager
        {
            public static T GetAppSettings<T>(string key) where T : class, new()
            {
                IConfiguration config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
                return new ServiceCollection()
                          .AddOptions()
                          .Configure<T>(config.GetSection(key))
                          .BuildServiceProvider()
                          .GetService<IOptions<T>>()
                          .Value;
            }
        }

    调用方法:

    public class ContactModel : PageModel
        {
            public string Message { get; set; }
            public FormatOptions Options { get; set; }
    
            public ContactModel(IOptions<FormatOptions> option)
            {
                //this.Options = option.Value;
                this.Options = ConfigurationManager.GetAppSettings<FormatOptions>("Format");
            }
    
            public void OnGet()
            {
                Message = "Your contact page.";
            }
        }

  • 相关阅读:
    单进程架构数据库谨防隐形杀手
    21.2 超时与重传的简单例子
    19日下午三点直播:DevOps体系中数据库端的四大问题及解决之道
    SQL无所不能:DBA宝妈宝爸系列分享
    用Excel做了7天报表,这个领导喜欢的可视化工具,只用了7小时
    从块结构谈表的存储参数与性能之间的关系
    MYSQL SHELL 到底是个什么局 剑指 “大芒果”
    大数据构架师经典学习宝典
    POJ 3171 区间最小花费覆盖 (DP+线段树
    POJ 3171 区间最小花费覆盖 (DP+线段树
  • 原文地址:https://www.cnblogs.com/wangwust/p/9843857.html
Copyright © 2011-2022 走看看