应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务(比如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文件,加入日志控制台输出的代码。关键代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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的连接信息配置进去:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | { "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的值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | { "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对象的方式来获取配置信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [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对象
这种方法首先需要根据配置数据的结构,自定义一个用于保存配置数据的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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方法,将配置注入进来:
1 2 3 4 5 6 | public void ConfigureServices(IServiceCollection services) { // ... services.Configure<Mongo>(Configuration.GetSection( "mongo" )); // ... } |
最后,在控制器的构造函数中注入IOptions对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [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的源代码进行深入了解。
相关文章:
.NET Core开发日志——配置
.NET Core微服务之基于Apollo实现统一配置中心
原文地址: http://sunnycoding.cn/2018/08/25/aspnetcore-configuration/
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com