zoukankan      html  css  js  c++  java
  • (12)ASP.NET Core2.2 中的配置二(Configuration)

    1.内存配置

    MemoryConfigurationProvider使用内存中集合作为配置键值对。若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemoryCollection扩展方法。可以使用IEnumerable<KeyValuePair<String,String>> 初始化配置提供程序。构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:

    public class Program
    {
        public static readonly Dictionary<string, string> _dict =
            new Dictionary<string, string>
            {
                {"MemoryCollectionKey1", "value1"},
                {"MemoryCollectionKey2", "value2"}
            };
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddInMemoryCollection(_dict);
                })
                .UseStartup<Startup>();
    }

    而通过启动应用程序时会看到如下配置信息:

    1.1GetValue

    ConfigurationBinder.GetValue<T>从具有指定键的配置中提取一个值,并可以将其转换为指定类型。如果未找到该键,则获取配置默认值。如上述示例中,配置两个value1、value2值,现在我们在键MemoryCollectionKey1配置中提取对应字符串值,如果找不到配置键MemoryCollectionKey1,则默认使用value3配置值,示例代码如下:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        var config = Configuration.GetValue<string>("MemoryCollectionKey1", "value3");
    }

    而通过启动应用程序时会看到如下配置信息:

    ConfigurationBinder.GetValue找到定义string类型MemoryCollectionKey1键值并输出。如果我们把获取键名称更改为MemoryCollectionKey3,再来看看获取键值输出结果:

    我们会看到当ConfigurationBinder.GetValue找不到定义string类型MemoryCollectionKey3键时,则输出默认值。

    2.绑定到实体类

    可以使用选项模式将文件配置绑定到相关实体类。配置值作为字符串返回,但调用Bind 可以绑定POCO对象。Bind在Microsoft.Extensions.Configuration.Binder包中,后者在 Microsoft.AspNetCore.App元包中。现在我们在CoreWeb/Models目录下新增一个叫starship.json文件,配置内容如下:

    {
      "starship": {
        "name": "USS Enterprise",
        "registry": "NCC-1701",
        "class": "Constitution",
        "length": 304.8,
        "commissioned": false
      },
      "trademark": "Paramount Pictures Corp. http://www.paramount.com"
    }

    然后再新增一个对应配置内容的实体模型(/Models/Starship.cs):

    public class Starship
    {
        public string Name { get; set; }
        public string Registry { get; set; }
        public string Class { get; set; }
        public decimal Length { get; set; }
        public bool Commissioned { get; set; }
    }

    构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:

    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.SetBasePath(Directory.GetCurrentDirectory());
                config.AddJsonFile(
                    "starship.json", optional: true, reloadOnChange: true);
            })
            .UseStartup<Startup>();

    示例应用程序调用GetSection方法获取json文件中starship键。通过Bind方法把starship键属性值绑定到Starship类的实例中:

    var starship = new Starship();
    Configuration.GetSection("starship").Bind(starship);
    var _starship = starship;

    当应用程序启动时会提供JSON文件配置内容:

    3.绑定至对象图

    通过第2小节我们学习到如何绑定配置文件内容映射到实例化实体类属性去,同样,配置文件内容也可以绑定到对象图去。现在我们在CoreWeb/Models目录下新增一个叫tvshow.xml文件,配置内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <tvshow>
        <metadata>
          <series>Dr. Who</series>
          <title>The Sun Makers</title>
          <airdate>11/26/1977</airdate>
          <episodes>4</episodes>
        </metadata>
        <actors>
          <names>Tom Baker, Louise Jameson, John Leeson</names>
        </actors>
        <legal>(c)1977 BBC https://www.bbc.co.uk/programmes/b006q2x0</legal>
      </tvshow>
    </configuration>

    然后再新增一个对应配置内容的实体模型(/Models/TvShow.cs),其对象图包含Metadata和 Actors类:

    public class TvShow
    {
        public Metadata Metadata { get; set; }
        public Actors Actors { get; set; }
        public string Legal { get; set; }
    }
    public class Metadata
    {
        public string Series { get; set; }
        public string Title { get; set; }
        public DateTime AirDate { get; set; }
        public int Episodes { get; set; }
    }
    public class Actors
    {
        public string Names { get; set; }
    }

    构建主机时调用ConfigureAppConfiguration以指定应用程序的配置:
    config.AddXmlFile("tvshow.xml", optional: true, reloadOnChange: true);
    使用Bind方法将配置内容绑定到整个TvShow对象图。将绑定实例分配给用于呈现的属性:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        var tvShow = new TvShow();
        Configuration.GetSection("tvshow").Bind(tvShow);
        var _tvShow = tvShow;
    }

    当应用程序启动时会提供XML文件配置内容:

    还有一种Bind方法可以将配置内容绑定到整个TvShow对象图:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        var _tvShow = Configuration.GetSection("tvshow").Get<TvShow>();
    }

    当应用程序启动时会提供XML文件配置内容:

    4.将数组绑定至类

    Bind方法也支持把配置内容键中的数组绑定到对象类去。公开数字键段(:0:、:1:、… :{n}:)的任何数组格式都能够与POCO类数组进行绑定。使用内存配置提供应用程序在示例中加载这些键和值:

    public class Program
    {
        public static Dictionary<string, string> arrayDict =
                new Dictionary<string, string>
                {
                    {"array:entries:0", "value0"},
                    {"array:entries:1", "value1"},
                    {"array:entries:2", "value2"},
                    {"array:entries:4", "value4"},
                    {"array:entries:5", "value5"}
                };
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.SetBasePath(Directory.GetCurrentDirectory());
                    config.AddInMemoryCollection(arrayDict);
                })
                .UseStartup<Startup>();
    }

    因为配置绑定程序无法绑定null值,所以该数组跳过了索引#3的值。在示例应用程序中,POCO类可用于保存绑定的配置数据:

    public class ArrayExample
    {
        public string[] Entries { get; set; }
    }

    将配置数据绑定至对象:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        var arrayExample = new ArrayExample();
        Configuration.GetSection("array").Bind(arrayExample);
        var _arrayExample = arrayExample;
    }

    还可以使用ConfigurationBinder.Get<T>语法,从而产生更精简的代码:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        var _arrayExample = _config.GetSection("array").Get<ArrayExample>();
    }

    当应用程序启动时会提供内存配置内容:

    5.在Razor Pages页或MVC视图中访问配置

    若要访问RazorPages页或MVC视图中的配置设置,请为Microsoft.Extensions.Configuration命名空间添加using指令(C#参考:using指令)并将IConfiguration注入页面或视图。
    在Razor页面页中:

    @page
    @model IndexModel
    @using Microsoft.Extensions.Configuration
    @inject IConfiguration Configuration
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>Index Page</title>
    </head>
    <body>
        <h1>Access configuration in a Razor Pages page</h1>
        <p>Configuration value for 'key': @Configuration["key"]</p>
    </body>
    </html>

    在MVC视图中:

    @using Microsoft.Extensions.Configuration
    @inject IConfiguration Configuration
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>Index View</title>
    </head>
    <body>
        <h1>Access configuration in an MVC view</h1>
        <p>Configuration value for 'key': @Configuration["key"]</p>
    </body>
    </html>


    参考文献:
    ASP.NET Core 中的配置

  • 相关阅读:
    关于android 代码生成布局中遇到的一些问题
    关于选择移动开发平台(android,ios,wp7)的一些看法
    如何成为一个C++高级程序员(转帖)
    最新Windows平台下Android源码的下载(转+原)
    峨眉之巅放歌
    孝感人间
    迁芸(帮客户名字作诗)
    载春
    杨美花(帮客户名字作诗)
    人生几度温泉夜
  • 原文地址:https://www.cnblogs.com/wzk153/p/11264554.html
Copyright © 2011-2022 走看看