视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.NET Core配置多环境的方法步骤
2020-11-27 22:34:38 责编:小采
文档


配置多环境是日常开发经常需要用到的操作,实现多环境配置后可以规避生产测试环境混合带来的麻烦和风险,减少项目风险,并且也可以通过多环境来保证生产环境上密钥的安全。

我之前在做iOS开发时,iOS的解决方法是通过多个Target配置不同的环境变量,并且配合宏来实现不同的环境启动时,读取不同的配置,在.NET Core中当然也会有类似的这种方式,并且它比iOS中更简单,只需要注入不同的环境变量即可,而iOS还需要建立多个Target才能实现注入不同的环境变量,.NET Core则可以直接在启动时注入不同的环境变量,根本无需再做其它操作。

方式一:预编译指令DEBUG

#if DEBUG
 //读取环境1配置文件
#else
 //读取环境2配置文件
#endif

如果你只有两套环境,这种方式也勉强够用,在日常开发中,我们基本上都是DeBug模式运行的,在生产环境发布的代码,也基本上都是编译的Release代码,所以使用预编译指令 #if DEBUG 即可以满足这种需求,而且这种操作方式非常简单,只需要准备两个不同的配置文件来给两个不同环境读取即可。

/// <summary>
 /// 全局配置管理类(按照DEBUG/RELEASE区分环境)
 /// </summary>
 public static class MyConfiguration
 {
 public static IConfiguration Configuration { get; set; }
 static MyConfiguration()
 {
 #if DEBUG
 var envPath = "appsettings.Development.json";
 #else
 var envPath = "appsettings.json";
 #endif
 Configuration = new ConfigurationBuilder()
 .Add(new JsonConfigurationSource
 {
 Path = envPath,
 ReloadOnChange = true
 }).Build();
 }
 }

但是如果你想调试生产环境或者想实现两个以上的环境的话,那么就只能使用第二种方式了。

方式二:注入不同环境变量

首先准备好你不同环境的配置文件,例如:

然后选择启动项目Properties下的launchSettings.json文件,添加如下配置:

{
 "profiles": {
 "240": {
 "commandName": "240",
 "launchBrowser": true,
 "launchUrl": "",
 "environmentVariables": {
 "ASPNETCORE_ENVIRONMENT": "Dev240"
 }
 },
 "241": {
 "commandName": "241",
 "launchBrowser": true,
 "launchUrl": "",
 "environmentVariables": {
 "ASPNETCORE_ENVIRONMENT": "Dev241"
 }
 },"243": {
 "commandName": "243",
 "launchBrowser": true,
 "launchUrl": "",
 "environmentVariables": {
 "ASPNETCORE_ENVIRONMENT": "Dev243"
 }
 },"Staging": {
 "commandName": "Staging",
 "launchBrowser": true,
 "launchUrl": "",
 "environmentVariables": {
 "ASPNETCORE_ENVIRONMENT": "Staging"
 }
 }
 }
}

此时,启动选择已然变成这样:

当然,我们也可以直接在启动项目的Properties里面改,如下图:

当然环境变量配置好了之后,我们就需要来使用环境变量,新建一个配置的工具类文件:

/// <summary>
 /// 全局配置管理类(适配多环境)
 /// </summary>
 public static class MyConfigurationHelper
 {
 public static IConfiguration Config { get; set; }
 static MyConfigurationHelper()
 {
 var env = BfServiceProvider.ServiceProvider.GetRequiredService<IHostingEnvironment>();
 Config = new ConfigurationBuilder()
 .SetBasePath(env.ContentRootPath)
 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true)
 .Build();
 }
 
 }

 public static class MyServiceProvider
 {
 public static IServiceProvider ServiceProvider { get; set; }
 }

这个文件中提供了一个读取配置 IConfigurationMyConfigurationHelper 类和一个提供 IServiceProvider 容器的 MyServiceProviderIServiceProvider 是.NET Core中的服务容器,他能够访问到程序注入的环境变量,然后进入 Startup.cs 中引用这个文件,并且在 Configure 方法中,将 IApplicationBuilderApplicationServices 传递进去。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
 {
 //配置多环境
 MyServiceProvider.ServiceProvider = app.ApplicationServices;
 }

这时,我们回过去看 MyConfigurationHelper 类,它将会在下一次被使用时,从 IServiceProvider 中读取我们选择的启动环境对应的环境变量字符串Dev240、Dev241、Dev243、Staging;从而实现读取不同的配置文件与 IConfiguration Config 中,我们后继使用读取配置文件的操作时,都将使用 MyConfigurationHelper.Config 来进行读取。

发布时区分多环境

在Liunx上面,我们使用supervisor来守护我们的.NET Core应用程序,所以我们想要运行哪个环境,就可以在supervisor的项目配置中进行配置,修改 /etc/supervisord.d/ 下的配置文件键入环境变量如下:

# /etc/supervisord.d/DotNetCoreTest.ini
[program:DotNetCoreTest]
directory=/xxx/DotNetCoreTest
command=dotnet DotNetCoreTest.dll
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/xxx/logs/DotNetCoreTest.log
# 环境变量
environment=ASPNETCORE_ENVIRONMENT=Dev240

方式一在发布时只需要编译Release就能自动读取对应环境的配置文件,无需上面的操作。

下载本文
显示全文
专题