今天在把以前一個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; }