.NET Core 实战 [No.333~334] 启动环境
在之前的博客中提到过 Environment 环境变量有 3 个预定义的值,分别表示了常用的 3 种启动环境。
- Development:开发环境
- Staging:预览环境
- Production:生产环境
但这些仅是参考值,开发人员可以根据自己的需要自定义该环境变量的值。
在这篇博客有讲到开发时怎么使用自定义的 Environment 环境变量值配置多个运行环境。
.NET Core 项目发布后是不带 launchSettings.json 运行设置文件的(默认为 Production 启动环境),此时若要指定启动环境可以使用 IWebHostBuilder
接口的 UseEnvironment 扩展方法。
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseEnvironment("Preview")
.UseStartup<Startup>();
Startup
类中的 Configure 方法支持依赖注入,可以添加 IHostingEnvironment
类型的参数接收注入。
Microsoft.AspNetCore.Hosting.HostingEnvironmentExtensions 扩展类中提供了 IHostingEnvironment
类的几个扩展方法:
- IsDevelopment
- IsStaging
- IsProduction
- IsEnvironment
其中 IsEnvironment 方法用于判断是否是指定的自定义环境。
当然也可以通过 IHostingEnvironment
类的 EnvironmentName 属性来判断启动环境。
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Development environment.");
});
}
else if (env.IsEnvironment("Preview"))
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Preview environment.");
});
}
}
不过上述方案会导致各种环境的代码纠缠在一起,最好是利用 Startup 类支持匹配启动环境的特性来将其解耦。
匹配方案有两种:
Startup 类名与环境匹配
如,用于开发环境的 Startup 类可以命名为 StartupDevelopment 类。
书上是提到了这个方案,不过我没有运行成功。不确定是不是版本的问题(开发环境为 VS2017 + .NET Core 2.1)。
Configure 约定方法名与环境匹配
如,用于开发环境的 Configure 方法可以命名为 ConfigureDevelopment(此时仅不会再调用默认的 Configure 方法)。
csharppublic void ConfigureDevelopment(IApplicationBuilder app, IHostingEnvironment env) { app.Run(async (context) => { await context.Response.WriteAsync("Development Environment."); }); }
参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著