ASP.NET Core应用程序的参数配置及使用
應用程序的開發不僅僅是寫代碼這點事情。假設你正在開發一個能夠支持多次部署的微服務,此時你就需要有一個合理的應用程序配置方案,以便在開發和生產環境中能夠方便地選用不同的配置參數,并且能夠在部署到容器服務(比如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文件,加入日志控制臺輸出的代碼。關鍵代碼如下:
| 12345678910111213141516171819 | 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的連接信息配置進去:
| 123456789101112131415 | {??"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的值:
| 1234567891011121314151617 | {??"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對象的方式來獲取配置信息:
| 123456789101112131415161718 | [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對象
這種方法首先需要根據配置數據的結構,自定義一個用于保存配置數據的類:
| 12345678910111213 | 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方法,將配置注入進來:
| 123456 | public void ConfigureServices(IServiceCollection services){????// ...????services.Configure<Mongo>(Configuration.GetSection("mongo"));????// ...} |
最后,在控制器的構造函數中注入IOptions對象:
| 123456789101112131415161718 | [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
總結
以上是生活随笔為你收集整理的ASP.NET Core应用程序的参数配置及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 漫谈单体架构与微服务架构(上):单体架构
- 下一篇: RabbitMQ一个简单可靠的方案(.N