ASP.NET Core系列:讀取配置文件

1. 控制檯應用

   新建一個控制檯應用,添加兩個Package:node

Install-Package Microsoft.Extensions.Configuration
Install-Package Microsoft.Extensions.Configuration.Json

1.1 單個配置文件

  建立配置文件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

1.2 多個配置文件

  AddJsonFile:添加多個配置文件。

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json")
    .AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: true);
{
  "Data": "10000",
  "ConnectionStrings": {
    "DefaultContext": "默認庫"
  }
}
appsettings.json
{
  "Data": "10000",
  "ConnectionStrings": {
    "DefaultContext": "開發庫"
  }
}
appsettings.Development.json
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.3 配置讀取綁定

  (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; }
    }
}
Node.cs
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"
      }
    ]
  }
}
appsettings.json
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);
            }
        }
    }
}

2. API應用程序

  新建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)......

2.1 ConfigureServices中鍵值讀取

  在根目錄下文件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>>();
}

2.2 ConfigureServices中使用Options

  添加安裝包: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;
    }
}

2.3 讀取自定義配置文件

  在項目根目錄下,新建配置文件 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;
}

2.4 獨立類中讀取配置

  在.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);
        }
    }
}
相關文章
相關標籤/搜索