Skip to content

.NET Core 实战 [No.333~334] 启动环境

🏷️ 《.NET Core 实战》

之前的博客中提到过 Environment 环境变量有 3 个预定义的值,分别表示了常用的 3 种启动环境。

  • Development:开发环境
  • Staging:预览环境
  • Production:生产环境

但这些仅是参考值,开发人员可以根据自己的需要自定义该环境变量的值。
这篇博客有讲到开发时怎么使用自定义的 Environment 环境变量值配置多个运行环境。
.NET Core 项目发布后是不带 launchSettings.json 运行设置文件的(默认为 Production 启动环境),此时若要指定启动环境可以使用 IWebHostBuilder 接口的 UseEnvironment 扩展方法。

csharp
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 属性来判断启动环境。

csharp
// 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 类支持匹配启动环境的特性来将其解耦。

匹配方案有两种:

  1. Startup 类名与环境匹配

    如,用于开发环境的 Startup 类可以命名为 StartupDevelopment 类。

    书上是提到了这个方案,不过我没有运行成功。不确定是不是版本的问题(开发环境为 VS2017 + .NET Core 2.1)。

  2. Configure 约定方法名与环境匹配

    如,用于开发环境的 Configure 方法可以命名为 ConfigureDevelopment(此时仅不会再调用默认的 Configure 方法)。

    csharp
    public void ConfigureDevelopment(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Development Environment.");
        });
    }

参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著