.NET基础篇-6.启动流程之Environment 马仔也是黑社会
.NET基础篇-6.启动流程之Environment 马仔也是黑社会
Environment在启动流程中的使用比较简单,算是团伙里的小马仔。在实际生产中通过其他手段,甚至不做配置也可以保证程序运行–至少我做过的项目中很少有配置builder.Environment。但可是但,马仔也是黑社会,结局时突然杀出来捅死老大,改变剧情走向的比比皆是,问题是这小弟你平时得教得好,用得顺。
1. 干啥的
就是个-臭-配置运行环境的。
主要负责把当前运行环境暴露给配置、DI、日志、中间件等后续环节。天天拎着个刀片在各个码头晃荡,其实有他没他都可以,你嫌他烦说他两句,他歪着头斜着眼,用手把烟屁股从嘴里揪出来,晃荡着肩膀跟你说“老大让我来的”。头上插着4根鸡毛:
- 标识环境(Development/Staging/Production/自定义环境)
- 提供3个只读路径(ContentRoot/WebRoot/EnvironmentName)
- 作为配置源(appsettings.{Environment}.json 的变量 {env})
- 作为DI服务(单例注入IWebHostEnvironment/IHostEnvironment,随时取路径、判断环境)
2.有啥用
2.1 4个常用属性
- EnvironmentName
- 当前环境名称ApplicationName
- 当前项目名称ContentRootPath
- 项目根目录WebRootPath
- wwwrooot目录(可空)
上点儿小代码:
var builder = WebApplication.CreateBuilder(args);
var env = builder.Environment;Console.WriteLine(env.EnvironmentName);
Console.WriteLine(env.ApplicationName);
Console.WriteLine(env.ContentRootPath);
Console.WriteLine(env.WebRootPath);

一点儿小特性:
1.赋环境名,立即生效(影响后续配置)
builder.Environment.EnvironmentName = "Daily";
// 立即重载:
// 1) 配置系统重新过滤 appsettings.Daily.json
// 2) 日志过滤器重新计算
// 3) 依赖 IHostEnvironment 的代码立即看到新值
Tips:EnvironmentName是来自于launchSettings.json里的ASPNETCORE_ENVIRONMENT,也可以在命令行里指定覆盖
dotnet run --environment "Staging"
2.切换ContentRoot/WebRoot
builder.Environment.ContentRootPath = @"c:\newroot";
builder.Environment.WebRootPath = @"c:\newroot\www";
// 注意:路径必须已存在,否则 Hosting 会在 Build() 抛 DirectoryNotFoundException
3.在Configuration里指定环境配置文件使用 - 上一篇的回忆库库撞大脑
builder.Configuration.AddJsonFile(
$"myconfig.{builder.Environment.EnvironmentName}.json",
optional: true,
reloadOnChange: true);
4…NET8新增:提前锁死环境名,防止后续覆盖
var builder = WebApplication.CreateBuilder(
new WebApplicationOptions
{
Args = args,
EnvironmentName = "Production"
// 最高优先级
});
2.2 扩展方法-自带
- env.IsDevelopment() - 是否是开发环境
- env.IsStaging() - 是否是stag环境
- env.IsProduction() - 是否是生产环境
- env.IsEnvironment(“Daily”) -是否是自定义环境
2.3 两个获取文件的方法
//获取或设置指定路径的文件信息
env.ContentRootFileProvider.GetFileInfo("subpath");
//获取或设置wwwroot子文件夹里的文件
env.WebRootFileProvider.GetFileInfo("subpath");
两个方法都是返回IFileInfo -都常见的属性和方法:

2.3 DI功能
可以在任意地方获取到环境对象,IWebHostEnvironment和IHostEnvironment,然后读取环境属性:

很明显是被注入容器了。
源码
3.1 IWebHostEnvironment
WebApplicationBuilder里的Environment其实就是IWebHostEnvironment,源码路径\src\Hosting\Abstractions\src:


3.2 IHostEnvironment
其他几个呢,哦,你还继承IHostEnvironment(代码路径:dotnet/runime\src\libraries\Microsoft.Extensions.Hosting.Abstractions\src):

3.3 容器注入
不是有DI功能吗,哪里注入的呢?

在WebHostBuilder的Build的时候。

被折叠的 条评论
为什么被折叠?



