ASP.NET Core讀取AppSettings (轉載)

今天在把以前一個ASP.NET MVC5的Demo項目重寫成ASP.NET Core,發現原先咱們一直用的ConfigurationManager.AppSettings[]讀取Web.config中的AppSettings節點的方法沒用了。.NET Core有許多新的作法,我挑了一個最合適我本身項目的來分享一下個人實現方式。
首先,原來的代碼:html

web.configweb

... <appSettings> ... <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=YOURACCOUNT;AccountKey=YOURKEY" />
    <add key="AzureStorageAccountContainer" value="YOURCONTAINER" /> ... </appSettings> ...

Controller:json

private static CloudBlobContainer GetBlobContainer() { string connectionString = WebConfigurationManager.AppSettings["StorageConnectionString"]; ... blobClient.GetContainerReference(WebConfigurationManager.AppSettings["AzureStorageAccountContainer"]); return container; }

這也是ASP.NET以來咱們一直用來讀web.config的方式。若是你想了解更裝逼的方式,能夠參考這篇文章: 《如何高逼格讀取Web.config中的AppSettings》 ,文章裏解決的問題主要是一個強類型的配置項,然而ASP.NET Core能夠更方便的實現這個逼格。服務器


首先,ASP.NET Core的設置文件用的是appsettings.json,而不是web.config,對於ASP.NET Core來講,web.config只是在部署到Windows服務器的時候給IIS用的配置,和ASP.NET Core一點卵關係都沒有。
這個appsettings.json定義的格式以下:app

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information"
        }
    }
}

我把本身的配置項加進去就能夠這樣寫:函數

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "AppSettings": { "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=YOURACCOUNTNAME;AccountKey=YOURKEY", "AzureStorageAccountContainer": "YOURCONTAINERNAME" }
}

接下來,新建一個C#的Class,對應你的配置項:post

public class AppSettings { public string StorageConnectionString { get; set; } public string AzureStorageAccountContainer { get; set; } }

而後打開Startup.cs,把ConfigureServices這個方法改爲這樣(假設你是用ASP.NET Core的Web Application模板建立的網站)網站

public void ConfigureServices(IServiceCollection services) { // Add framework services.
 services.AddOptions(); services.Configure<AppSettings>(Configuration.GetSection("AppSettings")); services.AddMvc(); }

這個方法是作IOC的,是一種裝逼模式,須要項目引用Nuget包(在ASP.NET Core 2.0項目中這個Nuget包默認就是被引用了的):ui

Microsoft.Extensions.Options.ConfigurationExtensionsspa

 

而後在ASP.NET Core項目Startup類的構造函數中,配置Configuration對象:

public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; }

而後Configuration.GetSection("AppSettings")這個裏面的"AppSettings"對應的就是剛纔json文件裏配置的"AppSettings"節點。

services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));

這行代碼的意思就是,一旦咱們的應用裏要用AppSettings這個類型,就用Configuration.GetSection("AppSettings")的結果來替代,.NET Core會自動幫咱們作類型轉換和mapping,把在 《如何高逼格讀取Web.config中的AppSettings》 裏面裝的逼全裝掉了。

最後,你在Controller裏用的時候就得按照IOC的一向裝逼方法,把構造函數裝成這樣:

private AppSettings AppSettings { get; set; } public HomeController(IOptions<AppSettings> settings) { AppSettings = settings.Value; }

而後就能愉快的使用強類型的config了:

private CloudBlobContainer GetBlobContainer() { string connectionString = AppSettings.StorageConnectionString; CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference(AppSettings.AzureStorageAccountContainer); return container; }

 

 

原文連接

相關文章
相關標籤/搜索