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

 

 

原文连接

相关文章
相关标签/搜索