1. 程式人生 > >ASP NET Core 2 0 全域性配置項

ASP NET Core 2 0 全域性配置項

               

問題

如何在 ASP.NET Core 2.0 應用程式中讀取全域性配置項?

答案

首先新建一個空專案,並新增兩個配置檔案:

1. appsettings.json

{  "Section1": {    "SettingA": "ValueA",    "SettingB": "ValueB"  },  
"Section2": {    "SettingC": "ValueC"  }}


2. appsettings.Development.json


{  "Section1": {    "SettingA": "Dev_ValueA"  },  "Section2": {    "SettingC": "Dev_ValueC"  }}

Visual Studio會自動識別兩者的關係,並在解決方案層次結構中展示如下:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

然後建立相應的POCO類,分別對應於幾個配置節點:


public class AppSettings{   
 
public AppSettingsSection1 Section1 { get; set; }    public AppSettingsSection2 Section2 { get; set; }}

public class AppSettingsSection1{  
 
public string SettingA { get; set; }  

 
public string
SettingB { get; set; }}

public class AppSettingsSection2{  
  
public string SettingC { get; set; }}


在Startup.cs檔案中,建立接收 IConfiguration 的建構函式:

public static IConfiguration Configuration { get;
private set;}

public Startup(IConfiguration config){    Configuration = config;}

然後在 ConfigureServices() 方法中新增Options服務,並設定依賴項:

public void ConfigureServices(IServiceCollection services){    services.AddOptions();    services.Configure<AppSettings>(Configuration);}

最後,將配置項作為IOptions介面注入中介軟體的建構函式,其中泛型型別T就是我們剛才定義的POCO類:


public class HelloWorldMiddleware{   

 
private readonly RequestDelegate _next;  
 
private readonly AppSettings _settings;

  
public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options)    {        _next = next;        _settings = options.Value;    }  

 
public async Task Invoke(HttpContext context)    {      
    
var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);    
   
await context.Response.WriteAsync(jsonSettings);    }}

public static class UseHelloWorldInClassExtensions{  
   
public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder app)    {      
  
return app.UseMiddleware<HelloWorldMiddleware>();    }}

在Startup.cs的 Configure() 方法中,將此中介軟體注入到請求管道中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env){    app.UseHelloWorld();}

執行,此時頁面顯示:

0?wx_fmt=png

討論

 ASP.NET Core 擁有一個簡單的機制來從各種資料來源(比如JSON檔案,環境變數,甚至是自定義資料來源)中讀取應用程式設定。然後通過依賴注入,方便的使用這些配置項。

儘管這一切看起來很魔幻(我們的設定究竟是如何載入的!),ASP.NET Core 2.0隱藏了從資料來源中讀取配置項的細節,這些內容本應該存在於Program.cs檔案中WebHost的CreateDefaultBuilder()方法中。IConfiguration隨後被新增到服務容器中,並在應用程式的其他部分保持可用,我們使用Startup中的此介面來新增配置項。為了觀察這個過程,請將Program.cs檔案中的BuildWebHost()方法替換為如下內容,得到的結果是一樣的:

public static IWebHost BuildWebHost(string[] args) =>    WebHost.CreateDefaultBuilder(args)        .UseStartup<Startup>()        .ConfigureAppConfiguration((context, builder) =>        {            var env = context.HostingEnvironment;            builder.AddJsonFile("appsettings.json",                         optional: true, reloadOnChange: true)                   .AddJsonFile($"appsettings.{env.EnvironmentName}.json",                         optional: true, reloadOnChange: true);            

if (env.IsDevelopment())            {              
 
var appAssembly = Assembly.Load(                    new AssemblyName(env.ApplicationName));      
          
if (appAssembly != null)                {                    builder.AddUserSecrets(appAssembly, optional: true);                }            }            builder.AddEnvironmentVariables();            if (args != null)            {                builder.AddCommandLine(args);            }        })        .Build();

在上面的解決方案中,我們提供了兩個JSON檔案資料來源。需要記著的一點是,這些檔案按照順序被依次讀取,後面的資料來源會覆蓋前面的資料來源。你也可以在上面的執行結果中注意到,SettingB配置項來自於第一個配置檔案,而其他兩個配置項都來自於第二個配置檔案。

注意:Startup.cs中的IConfiguration例項擁有public static修飾符,因此可以在整個應用程式期間使用此例項:

var valueA = Config["Section1:SettingA"];

然而,更好的辦法是將配置項讀入一個型別化的POCO類,並將其作為依賴項注入中介軟體或者控制器。上面的示例正好展示了這個模式。

你也可以為不同的配置節定義不同的POCO類,並使用IConfiguration的GetSection()方法來讀取。

 

====start by sanshi=========================

下面我們簡單擴充套件之前的示例,來讀取不同的配置節:

public void ConfigureServices(IServiceCollection services){    services.AddOptions();    services.Configure<AppSettings>(Configuration);    services.Configure<AppSettingsSection1>(Configuration.GetSection("Section1"));}

更新中介軟體程式碼,此時向中介軟體的建構函式注入兩個依賴項:


public class HelloWorldMiddleware{   
 
private readonly RequestDelegate _next;  
 
private readonly AppSettings _settings;    

private readonly AppSettingsSection1 _settingsSection1;  

 
public HelloWorldMiddleware(RequestDelegate next, IOptions<AppSettings> options, IOptions<AppSettingsSection1> optionsSection1)    {        _next = next;        _settings = options.Value;        _settingsSection1 = optionsSection1.Value;    }    

public async Task Invoke(HttpContext context)    {      
 
var jsonSettings = JsonConvert.SerializeObject(_settings, Formatting.Indented);      
 
var jsonSettingsSection1 = JsonConvert.SerializeObject(_settingsSection1, Formatting.Indented);    
   
await context.Response.WriteAsync("AppSettings:\n" + jsonSettings + "\n\nAppSettings - Section1:\n" + jsonSettingsSection1);    }}


執行,此時頁面顯示:

0?wx_fmt=png

====end by sanshi=========================

 

當然,我們也可以手工設定配置項的值,通過使用IServiceCollection.Configure的過載方法並接收強型別的lambda表示式:

====start by sanshi=========================

 修改ConfigurationServices()方法,手工設定配置項:

public void ConfigureServices(IServiceCollection services){    services.AddOptions();        services.Configure<AppSettings>(options =>    {        options.Section1 = new AppSettingsSection1();        options.Section1.SettingA = "SettingA Value";        options.Section1.SettingB = "SettingB Value";    });}


執行,此時頁面效果:

0?wx_fmt=png

====end by sanshi========================= 

原文:https://tahirnaushad.com/2017/08/15/asp-net-core-configuration/


原文地址:http://www.cnblogs.com/zhaopei/p/SSO.html


.NET社群新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

640?wx_fmt=jpeg

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow