zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    ABP理论学习之Swagger UI集成
    最佳加法表达式
    洛谷 P1736 创意吃鱼法
    洛谷P1387 最大正方形
    1078 最小生成树
    判断元素是否存在
    1531 山峰 【栈的应用】
    洛谷 P2335 [SDOI2005]位图
    矿藏估价
    二分法小结
  • 原文地址:https://www.cnblogs.com/LuoEast/p/6815361.html
Copyright © 2011-2022 走看看