新建一個控制檯應用,添加兩個Package:node
Install-Package Microsoft.Extensions.Configuration Install-Package Microsoft.Extensions.Configuration.Json
建立配置文件appsettings.json:json
{ "Data": "10000", "ConnectionStrings": { "DevContext": "開發庫", "ProdContext": "生產庫" } }
讀取配置文件:app
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); Console.WriteLine(config["Data"]); // 配置鍵 Console.WriteLine(config.GetSection("ConnectionStrings:DevContext").Value); // 分層鍵 } } }
經過ConfigurationBuilder對象來建立ConfigurationRoot對象,進行讀取配置文件。ide
SetBasePath:設置配置文件基礎路徑函數
AddJsonFile:添加讀取的Json文件ui
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json");
配置文件可選及修改自動加載設置:spa
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json");
配置鍵約定:code
(1)鍵不區分大小寫。 例如,ConnectionString 和 connectionstring 被視爲等效鍵。對象
(2)分層鍵使用冒號分隔符 (:)blog
AddJsonFile:添加多個配置文件。
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: true);
{ "Data": "10000", "ConnectionStrings": { "DefaultContext": "默認庫" } }
{ "Data": "10000", "ConnectionStrings": { "DefaultContext": "開發庫" } }
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json"); var config = builder.Build(); Console.WriteLine(config.GetConnectionString("DefaultContext")); // 輸出:開發庫 } } }
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.Development.json") .AddJsonFile("appsettings.json"); var config = builder.Build(); Console.WriteLine(config.GetConnectionString("DefaultContext")); // 輸出:默認庫 } } }
配置鍵相同時,讀取選擇最後一個添加的文件(AddJsonFile)。
若要讀取全部添加文件的配置信息,可遍歷ConfigurationRoot的Providers屬性。
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json"); var config = builder.Build(); foreach (var provider in config.Providers) { provider.TryGet("ConnectionStrings:DefaultContext", out string defaultContext); Console.WriteLine(defaultContext); } // 輸出:默認庫 // 開發庫 } } }
(1)Key讀取(鍵值對)
{ "AppID": 10000, "Node": { "ID": "1", "Text": "節點" } }
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var appID = config["AppID"];
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var nodeid = config.GetSection("Node").GetSection("ID").Value;
(2)綁定簡單數據類型 GetValue<T>
添加Package:Microsoft.Extensions.Configuration.Binder
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var appID = config.GetValue<int>("AppID"); Console.WriteLine(appID); } } }
(3)綁定到類對象 Get<T>
using System; using System.Collections.Generic; using System.Text; namespace Libing.Core.ConsoleApp { public class Node { public int ID { get; set; } public string Text { get; set; } } }
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var node = config.GetSection("Node").Get<Node>(); Console.WriteLine("{0}-{1}", node.ID, node.Text); } } }
(4)綁定集合對象
{ "Node": { "ID": 1, "Text": "節點", "Children": [ { "ID": 11, "Text": "子節點1" }, { "ID": 12, "Text": "子節點2" }, { "ID": 13, "Text": "子節點3" } ] } }
using System; using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(cfg => { cfg.Path = "appsettings.json"; cfg.Optional = false; cfg.ReloadOnChange = true; }); var config = builder.Build(); var children = config.GetSection("Node:Children").Get<IEnumerable<Node>>(); foreach (var child in children) { Console.WriteLine("{0}-{1}", child.ID, child.Text); } } } }
新建API應用程序,在根目錄下自動建立的Program.cs:
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
其中,CreateDefaultBuilder建立默認配置,包括:
(1)加載IConfiguration配置,讀取文件appsettings.json;
(2)加載IConfiguration配置,讀取文件appsettings.[EnvironmentName].json;
(3)......
在根目錄下文件Startup.cs中ConfigureServices()中採用鍵值對方式讀取:
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); int appid = Configuration.GetValue<int>("AppID"); var nodes = Configuration.GetSection("Node:Children").Get<IEnumerable<Node>>(); }
添加安裝包:Microsoft.Extensions.Options.ConfigurationExtensions
{ "Node": { "ID": 1, "Text": "NodeText" } }
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddOptions(); services.Configure<Node>(Configuration.GetSection("Node")); }
在控制器中,經過構造函數注入,讀取配置。
public class LogController : ControllerBase { private Node node; public LogController(IOptions<Node> option) { node = option.Value; } [HttpGet] public Node Get() { int id = node.ID; string text = node.Text; return node; } }
在項目根目錄下,新建配置文件 config.json:
{ "AppID": "10000" }
修改Program.js,增長讀取config.json文件。
public class Program { 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("config.json", optional: true, reloadOnChange: true); }) .UseStartup<Startup>(); }
在Startup.cs中調用:
public void ConfigureServices(IServiceCollection services) { // 省略其它代碼... string appid = Configuration.GetSection("AppID").Value; }
在.Net Framework中,ConfigurationManager類用於讀取配置文件。但在.Net Core中沒有該類,新建類ConfigurationManager用於讀取配置文件。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.IO; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Libing.Portal.Core.Api.Common.Configs { public static class ConfigurationManager { public readonly static IConfiguration Configuration; static ConfigurationManager() { Configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); } public static T GetSection<T>(string key) where T : class, new() { return new ServiceCollection() .AddOptions() .Configure<T>(Configuration.GetSection(key)) .BuildServiceProvider() .GetService<IOptions<T>>() .Value; } public static string GetSection(string key) { return Configuration.GetValue<string>(key); } } }