【APS.NET Core】- Json配置文件的读取 新建配置类 在Startup中读取  类库中读取配置文件

在项目目录下有个 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.";
        }
    }