【NET】.NET基础篇-6.启动流程之Environment 马仔也是黑社会

.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的时候。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值