http://www.tuicool.com/articles/rQruMzV
今天在把之前一個ASP.NET MVC5的Demo項目重寫成ASP.NET Core,發現原先我們一直用的ConfigurationManager.AppSettings[]讀取Web.config中的AppSettings節點的方法沒用了。.NET Core有許多新的做法,我挑了一個最合適我自己項目的來分享一下我的實現方式。
首先,原來的代碼:
web.config
...
<appSettings> ... <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=YOURACCOUNT;AccountKey=YOURKEY" /> <add key="AzureStorageAccountContainer" value="YOURCONTAINER" /> ... </appSettings> ...
Controller:
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定義的格式如下:
{
"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,對應你的配置項:
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的,是一種裝逼模式,我們要裝進去的逼用的是Snippet
Microsoft.Extensions.Options.ConfigurationExtensions
所以,得確保你的project.json里面有這項:
"dependencies": {
... "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", ... },
Configuration這個對象,在ASP.NET Core Web Applictaion的默認模板里已經自動擼好了,代碼如下:
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; }