zoukankan      html  css  js  c++  java
  • ASP.NET Core应用程序的参数配置及使用(转载)

    本文结构


    1. 提前准备
    2. 参数配置方式
      1. appsettings.json
      2. 环境变量
      3. 命令行参数
    3. 在控制器中使用配置参数
      1. 注入IConfiguration对象
      2. 注入IOptions对象
    4. 总结

    应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务(比如ACS或者Kubernetes)时,这些参数能够被动态地、合理地设置。本文通过最简单的形式,对ASP.NET Core应用程序的不同的配置方式进行介绍,并介绍了在应用程序中如何使用这些配置参数,相信对于ASP.NET Core的开发者会有很大帮助。

    提前准备


    我们首先使用Visual Studio 2017新建一个ASP.NET Core的应用程序,当然如果没有Visual Studio 2017的话,下载安装了.NET Core SDK之后,使用dotnet new命令也能创建ASP.NET Core应用程序,然后使用你平时习惯使用的编辑器进行代码编辑。我还是建议使用Visual Studio 2017,社区版(Community版)是完全免费的,功能上与专业版和企业版也没多大区别。免费的宇宙最强IDE,放着不用岂不是浪费么。

    言归正传,为了能够方便地看出ASP.NET Core应用程序使用配置数据的方式,我们首先修改Startup.cs文件,加入日志控制台输出的代码。关键代码如下:

    public class Startup
    {
        private readonly ILogger logger;
     
        public Startup(IConfiguration configuration, ILogger<Startup> logger)
        {
            Configuration = configuration;
            this.logger = logger;
        }
     
        public IConfiguration Configuration { get; }
     
        public void ConfigureServices(IServiceCollection services)
        {
            var mongoHost = Configuration["mongo:server:host"];
            logger.LogInformation("MongoDB Server Host: " + mongoHost);
            // .... 其它代码省略 ....
        }
    }

    接下来,我们就可以开始做实验了。

    参数配置方式


    ASP.NET Core提供了多样化的参数配置方式,总结起来,有以下几种常用的参数配置方式:

    • 通过appsettings.json文件
    • 使用系统环境变量
    • 通过命令行进行参数配置

    当然,还可以自定义配置文件或者其它的配置方式。不过这里我只打算介绍常规的用法,因为我相信目前ASP.NET Core默认提供的配置方式应该能够满足绝大部分应用场景。如需获取更多有关其它的参数配置方式的详细信息,可以参考微软官方文档

    appsettings.json

    appsettings.json文件是ASP.NET Core应用程序的配置文件,通常与应用程序的DLL文件在同一个目录下。通过ASPNETCORE_ENVIRONMENT环境变量可以指定具体使用哪个appsettings.json作为配置文件。比如,如果ASPNETCORE_ENVIRONMENT环境变量的值为Production,那么appsettings.Production.json文件就会被使用。这种根据环境变量来决定配置文件的方式,允许通过一个简单的字符串来决定一系列的参数取值,在实际应用中还是非常方便的。

    现在,我们修改appsettings.json文件,将MongoDB的连接信息配置进去:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information"
        }
      },
      "AllowedHosts": "*",
      "mongo": {
        "server": {
          "host": "localhost",
          "port": 27017
        },
        "database": "db"
      }
    }

    然后编译应用程序,并将appsettings.json文件复制到编译输出目录,之后在命令行通过dotnet命令启动应用程序:

    可以看到,配置数据已经正常输出。接下来,确认一下ASPNETCORE_ENVIRONMENT指定的是Development,因此,我们修改一下appsettings.Development.json文件,使用同样的结构配置MongoDB的连接信息,只不过我们使用localhost_dev来指定mongo:server:host的值:

    {
      "Logging": {
        "LogLevel": {
          "Default": "Debug",
          "System": "Information",
          "Microsoft": "Information"
        }
      },
     
      "mongo": {
        "server": {
          "host": "localhost_dev",
          "port": 27017
        },
        "database": "db"
      }
    }

    此时,再次启动应用程序,发现配置数据已经更新:

    因此,可以使用appsettings.json文件,根据不同的运行环境来选择使用不同的配置参数。

    环境变量

    appsettings.json文件中已经配置好的参数,可以被环境变量覆盖。我们可以通过set命令,在Windows的命令行中设置一个环境变量:

    再次运行应用程序,得到的结果就是环境变量里所设置的参数值:

    可以看出,之前由appsettings.json文件指定的参数,已经被环境变量所覆盖。这一特性十分重要,当我们把一个ASP.NET Core应用程序包装成一个docker镜像,并在docker容器中运行时,我们可以方便地使用docker run -e的参数,将环境变量注入进去,并覆盖原来写死在配置文件中的值,这也充分证明了ASP.NET Core对于容器的支持是十分友好的。

    命令行参数

    在使用dotnet启动应用程序时,可以直接在命令行提供运行时参数,此时命令行参数会覆盖环境变量中的设置,比如:

    同样,如果ASP.NET Core应用程序被包装成一个docker镜像,那么我们就可以通过docker exec命令对应用程序进行调试,并直接通过命令行注入调试时所需的参数。

    在控制器中使用配置参数


    要在控制器中使用配置参数,最常用的有两种方法,第一种是在控制器的构造函数中注入IConfiguration对象,另一种则是自定义一个配置数据模型,然后在控制器的构造函数中注入IOptions对象。

    注入IConfiguration对象

    以下代码演示了通过构造器注入IConfiguration对象的方式来获取配置信息:

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IConfiguration configuration;
     
        public ValuesController(IConfiguration configuration)
        {
            this.configuration = configuration;
        }
     
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { this.configuration["mongo:server:host"] };
        }
    }

    执行结果如下:

    注入IOptions对象

    这种方法首先需要根据配置数据的结构,自定义一个用于保存配置数据的类:

    public class Server
    {
        public string Host { get; set; }
     
        public int Port { get; set; }
    }
     
    public class Mongo
    {
        public Server Server { get; set; }
     
        public string Database { get; set; }
    }

    然后,修改Startup.ConfigureServices方法,将配置注入进来:

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.Configure<Mongo>(Configuration.GetSection("mongo"));
        // ...
    }

    最后,在控制器的构造函数中注入IOptions对象:

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IOptions<Mongo> configuration;
     
        public ValuesController(IOptions<Mongo> configuration)
        {
            this.configuration = configuration;
        }
     
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { this.configuration.Value.Server.Host };
        }
    }

    执行结果也是一样的:

    总结


    本文快速介绍了ASP.NET Core应用程序的基本配置和使用方式,相信对于ASP.NET Core的开发人员会有一定的帮助。ASP.NET Core应用程序的配置还是非常灵活方便的,如果有兴趣深入了解的话,强烈建议阅读微软官方文档,也可以阅读ASP.NET Core的源代码进行深入了解。

    原文链接

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/11199978.html
Copyright © 2011-2022 走看看