1. 程式人生 > >.net core讀取json格式的配置檔案

.net core讀取json格式的配置檔案

在.Net Framework中,配置檔案一般採用的是XML格式的,.NET Framework提供了專門的ConfigurationManager來讀取配置檔案的內容,.net core中推薦使用json格式的配置檔案,那麼在.net core中該如何讀取json檔案呢?

1、在Startup類中讀取json配置檔案

1、使用Configuration直接讀取

看下面的程式碼:

public IConfiguration Configuration { get; }

 Configuration屬性就是.net core中提供的用來讀取json檔案。例如:

public
void Configure(IApplicationBuilder app, IHostingEnvironment env) { string option1 = $"option1 = {this.Configuration["Option1"]}"; string option2 = $"option2 = {this.Configuration["Option2"]}"; string suboption1 = $"suboption1 = {this.Configuration["subsection:suboption1"
]}"; // 讀取陣列 string name1 = $"Name={this.Configuration["student:0:Name"]} "; string age1 = $"Age= {this.Configuration["student:0:Age"]}"; string name2 = $"Name={this.Configuration["student:1:Name"]}"; string age2 = $"Age= {this.Configuration["student:1
:Age"]}"; // 輸出 app.Run(c => c.Response.WriteAsync(option1+"\r\n"+option2+ "\r\n"+suboption1+ "\r\n"+name1+ "\r\n"+age1+ "\r\n"+name2+ "\r\n"+age2)); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseMvc(); }

 結果:

2、使用IOptions介面

1、定義實體類

public class MongodbHostOptions
{
        /// <summary>
        /// 連線字串
        /// </summary>
        public string Connection { get; set; }
        /// <summary>
        ////// </summary>
        public string DataBase { get; set; }

        public string Table { get; set; }
}

 2、修改json檔案

在appsettings.json檔案中新增MongodbHost節點:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "option1": "value1_from_json",
  "option2": 2,
  "subsection": {
    "suboption1": "subvalue1_from_json"
  },
  "student": [
    {
      "Name": "Gandalf",
      "Age": "1000"
    },
    {
      "Name": "Harry",
      "Age": "17"
    }
  ],
  "AllowedHosts": "*",
  //MongoDb
  "MongodbHost": {
    "Connection": "mongodb://127.0.0.1:27017",
    "DataBase": "TemplateDb",
    "Table": "CDATemplateInfo"
  }
}

 注意:

MongodbHost裡面的屬性名必須要和定義的實體類裡面的屬性名稱一致。

3、在StartUp類裡面配置

新增OptionConfigure方法繫結

private void OptionConfigure(IServiceCollection services)
{
      //MongodbHost資訊
      services.Configure<MongodbHostOptions>(Configuration.GetSection("MongodbHost"));
}

在ConfigureServices方法中呼叫上面定義的方法:

public void ConfigureServices(IServiceCollection services)
{
     // 呼叫OptionConfigure方法
     OptionConfigure(services);           
     services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

在控制器中使用,程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ReadJsonDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MongodbController : ControllerBase
    {
        private readonly MongodbHostOptions _mongodbHostOptions;

        /// <summary>
        /// 通過建構函式注入
        /// </summary>
        /// <param name="mongodbHostOptions"></param>
        public MongodbController(IOptions<MongodbHostOptions> mongodbHostOptions)
        {
            _mongodbHostOptions = mongodbHostOptions.Value;
        }

        [HttpGet]
        public async Task Get()
        {
           await Response.WriteAsync("Connection:" + _mongodbHostOptions.Connection + "\r\nDataBase;" + _mongodbHostOptions.DataBase + "\r\nTable:" + _mongodbHostOptions.Table);
        }
    }
}

 執行結果:

3、讀取自定義json檔案

在上面的例子中都是讀取的系統自帶的appsettings.json檔案,那麼該如何讀取我們自己定義的json檔案呢?這裡可以使用ConfigurationBuilder類。

例項化類

var builder = new ConfigurationBuilder();

 新增方式1

builder.AddJsonFile("path", false, true);

 其中path表示json檔案的路徑,包括路徑和檔名。

新增方式2

builder.Add(new JsonConfigurationSource {Path= "custom.json",Optional=false,ReloadOnChange=true }).Build()

 

具體程式碼如下:

private void CustomOptionConfigure(IServiceCollection services)
{
            IConfiguration _configuration;
            var builder = new ConfigurationBuilder();
            // 方式1
            //_configuration = builder.AddJsonFile("custom.json", false, true).Build();
            // 方式2
            _configuration = builder.Add(new JsonConfigurationSource {Path= "custom.json",Optional=false,ReloadOnChange=true }).Build();
            services.Configure<WebSiteOptions>(_configuration.GetSection("WebSiteConfig"));
}

ConfigureServices方法如下:

public void ConfigureServices(IServiceCollection services)
{
            // 呼叫OptionConfigure方法
            OptionConfigure(services);
            CustomOptionConfigure(services);
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

 控制器程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ReadJsonDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MongodbController : ControllerBase
    {
        private readonly MongodbHostOptions _mongodbHostOptions;

        private readonly WebSiteOptions _webSiteOptions;

        /// <summary>
        /// 通過建構函式注入
        /// </summary>
        /// <param name="mongodbHostOptions"></param>
        public MongodbController(IOptions<MongodbHostOptions> mongodbHostOptions,IOptions<WebSiteOptions> webSiteOptions)
        {
            _mongodbHostOptions = mongodbHostOptions.Value;
            _webSiteOptions = webSiteOptions.Value;
        }

        [HttpGet]
        public async Task Get()
        {
           await Response.WriteAsync("Connection:" + _mongodbHostOptions.Connection + "\r\nDataBase;" + _mongodbHostOptions.DataBase + "\r\nTable:" + _mongodbHostOptions.Table);
            await Response.WriteAsync("\r\n");
            await Response.WriteAsync("WebSiteName:" + _webSiteOptions.WebSiteName + "\r\nWebSiteUrl;" + _webSiteOptions.WebSiteUrl);
        }
    }
}

二、在類庫中讀取json檔案

在上面的示例中都是直接在應用程式中讀取的,那麼如何在單獨的類庫中讀取json檔案呢?看下面的示例程式碼:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace Common
{
    public class JsonConfigHelper
    {
        public static T GetAppSettings<T>(string fileName, string key) where T : class, new()
        {
            // 獲取bin目錄路徑
            var directory = AppContext.BaseDirectory;
            directory = directory.Replace("\\", "/");

            var filePath = $"{directory}/{fileName}";
            if (!File.Exists(filePath))
            {
                var length = directory.IndexOf("/bin");
                filePath = $"{directory.Substring(0, length)}/{fileName}";
            }

            IConfiguration configuration;
            var builder = new ConfigurationBuilder();
            
            builder.AddJsonFile(filePath, false, true);
            configuration = builder.Build();

            var appconfig = new ServiceCollection()
                .AddOptions()
                .Configure<T>(configuration.GetSection(key))
                .BuildServiceProvider()
                .GetService<IOptions<T>>()
                .Value;

            return appconfig;
        }
    }
}

注意:這裡要新增如下幾個程式集,並且要注意新增的程式集的版本要和.net core web專案裡面的程式集版本一致,否則會報版本衝突的錯誤

1、Microsoft.Extensions.Configuration

2、Microsoft.Extensions.configuration.json

3、Microsoft.Extensions.Options

4、Microsoft.Extensions.Options.ConfigurationExtensions

5、Microsoft.Extensions.Options

 json檔案如下:

{
  "WebSiteConfig": {
    "WebSiteName": "CustomWebSite",
    "WebSiteUrl": "https:localhost:12345"
  },
  "DbConfig": {
    "DataSource": "127.0.0.1",
    "InitialCatalog": "MyDb",
    "UserId": "sa",
    "Password": "123456"
  }
}

 DbHostOptions實體類定義如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ReadJsonDemo
{
    public class DbHostOptions
    {
        public string DataSource { get; set; }

        public string InitialCatalog { get; set; }

        public string UserId { get; set; }

        public string Password { get; set; }
    }
}

注意:這裡的DbHostOptions實體類應該建在單獨的類庫中,這裡為了演示方便直接建在應用程式中了。

在控制器中呼叫:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Common;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace ReadJsonDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MongodbController : ControllerBase
    {
        private readonly MongodbHostOptions _mongodbHostOptions;

        private readonly WebSiteOptions _webSiteOptions;

        /// <summary>
        /// 通過建構函式注入
        /// </summary>
        /// <param name="mongodbHostOptions"></param>
        public MongodbController(IOptions<MongodbHostOptions> mongodbHostOptions,IOptions<WebSiteOptions> webSiteOptions)
        {
            _mongodbHostOptions = mongodbHostOptions.Value;
            _webSiteOptions = webSiteOptions.Value;
        }

        [HttpGet]
        public async Task Get()
        {
            DbHostOptions dbOptions = JsonConfigHelper.GetAppSettings<DbHostOptions>("custom.json", "DbConfig");
            await Response.WriteAsync("DataSource:" + dbOptions.DataSource + "\r\nInitialCatalog;" + dbOptions.InitialCatalog+ "\r\nUserId:"+dbOptions.UserId+ "\r\nPassword"+dbOptions.Password);
            await Response.WriteAsync("\r\n");
            await Response.WriteAsync("Connection:" + _mongodbHostOptions.Connection + "\r\nDataBase;" + _mongodbHostOptions.DataBase + "\r\nTable:" + _mongodbHostOptions.Table);
            await Response.WriteAsync("\r\n");
            await Response.WriteAsync("WebSiteName:" + _webSiteOptions.WebSiteName + "\r\nWebSiteUrl;" + _webSiteOptions.WebSiteUrl);           
        }
    }
}

 執行結果: