ASP.NET Core讀取AppSettings


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; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM