与天地兮比寿,与日月兮齐光。这篇文章主要讲述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="https://www.songbingjia.com/android/DefaultEndpointsProtocol=https; AccountName=YOURACCOUNT; AccountKey=YOURKEY" /> < add key="AzureStorageAccountContainer" value="https://www.songbingjia.com/android/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; }
【ASP.NET Core读取AppSettings】然后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; }
推荐阅读
- Application对象
- android 广播的插件化
- Android动态获取权限
- 如何在Mac上安装Homebrew(操作步骤详细指南)
- Bash函数及其使用方法(变量、参数、返回值)
- Yarn与NPM有哪些区别(综合比较)
- 13个最佳Java IDE合集以及优缺点介绍
- 如何在Windows上安装Jenkins(分步指南)
- 如何创建WordPress网站(选择域名、托管、安装、插件等)