(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 中的配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM