自从.NET 6 开始,微软对应用的入口文件进行了调整,移除了 Main 方法和 Startup 文件,使用顶级语句的写法,将应用初始化的相关配置和操作全部集中在 Program.cs 文件中,如下:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(); var app = builder.Build(); // Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
} app.UseAuthorization(); app.MapControllers(); app.Run();

关于顶级语句语法的规范,大家可以通过官方文档了解一下:顶级语句。这种改变怎么说呢,我自己是挺不习惯的,虽然这种方式更加简洁,但是过于简洁也容易让人一脸懵,还是觉得之前的Startup文件的方式根据逻辑清晰一点,也更能做到关注点分离。

.NET 6 下应用的构建有了一些区别,不再直接使用原来的 Host 进行配置构建,而是通过 WebApplication 的静态方法构建 WebApplicationBuilder 来对主机进行配置,其实内部是 BootstrapHostBuilder 来进行的,调用 BootstrapHostBuilder 的相关配置方法时,只是将委托保存起来,之后还是通过 HostingBuilder 来进行配置。

调用 Builder 生成 WebApplication 对象时,还是以前配置主机的那些操作,传递给 WebApplication 的也是 IHost 对象。

而最终调用 WebApplication 对象的 Run 方法启动应用时,也是调用了主机的 StartAsync 方法,只是进行了一层包装,微软团队这样处理的好处暂时还不能很好得体会到。但总的来说改变也不大,虽然没了Startup类,但整体框架的基本模型并没有改变,之前能够在 Startup 中拿到的东西,在现在的入口文件中依旧可以拿到,我们依旧可以自由地控制整个请求管道,把握整体应用生命周期行为。

以下是 WebApplicationBuilder 对象 builder 张包含的几个关键实例

// builder 中可以获取到的几个关键实例
// 依赖注入容器
IServiceCollection service = builder.Services;
// 配置
IConfiguration configuration = builder.Configuration;
// 日志
ILoggingBuilder loggingBuilder = builder.Logging;
// 主机
IHostBuilder host = builder.Host;
IWebHostBuilder webHost = builder.WebHost;
// 环境
IWebHostEnvironment env = builder.Environment;

现在的依赖注入配置,直接通过 builder.services进行配置即可

// 依赖注入,相当于 Startup 中的ConfigureService方法
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

日志驱动配置:

// 日志提供程序配置,相当于之前主机中的 hostBuilder.ConfigureLogging
builder.Logging.AddConsole().AddDebug();

以下是 WebApplication 对象 app 中包含的几个关键实例

// app 中包含的几个关键实例
// 环境
IWebHostEnvironment enviroment = app.Environment;
// 配置
IConfiguration config = app.Configuration;
// 应用生命周期
IHostApplicationLifetime lifetime = app.Lifetime;
// 日志记录器
ILogger logger = app.Logger;
// 容器解析器
IServiceProvider serviceProvider = app.Services;

在执行完成 builder.Build(); 之后,应用已经初始化了依赖注入容器,所以我们可以通过 app.services获取我们需要的实例。

// 通过容器获取实例
var conf = app.Services.GetRequiredService<IConfiguration>();

当然,在 builder.Build(); 再通过builder.services 往容器中配置依赖注入关系是没有用的了,会抛出无效操作异常,因为容器已经创建,无法再修改。

根据顶级语句语法,顶级语句文件中存在隐式 using 指令, 但如果我们需要在 Program.cs 文件中额外引入一些命名空间也是可以的,using语句需要在文件的最前面,也可以定义方法或者类,只不过需要在顶级语句的后面,也可以使用异步方法。

参考文章:

顶级语句

ASP.NET Core 系列:

目录:ASP.NET Core 系列总结

上一篇:ASP.NET Core - IStartupFilter 与 IHostingStartup

最新文章

  1. 在布局文件中使用Fragment的步骤
  2. supervisor-2:event
  3. JavaScript作用域链
  4. html基本知识点
  5. Git工具:Widows下的使用(提交到Github)
  6. Linux下添加硬盘,分区,格式化详解
  7. android中获取时间
  8. oracle 性能优化--索引总结
  9. swift学习第五章-字典的使用
  10. (五)solr7.1.0之solrJ的使用
  11. Chrome headless 模式
  12. 用VS2017进行移动开发(C#、VB.NET)——Progress控件,Smobiler移动开发
  13. SpringBoot整合Swagger测试api构建
  14. Never Wait for Weights(带权并查集+路径压缩)
  15. 最接近的三数之和(给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数, 使得它们的和与 target 最接近。返回这三个数的和)
  16. Linux权限命令
  17. python爬取快手ios端首页热门视频
  18. 字符串(string)与整型(int)、浮点型(float)等之间的转换
  19. mysql 5.7.15 安装配置方法图文教程(转)
  20. 关于在SQLITE数据库表中插入本地系统时间的做法

热门文章

  1. 字符编码 XUTF
  2. CompletionService 使用小结
  3. 2.5:Python常用内置数据结构、多维数组ndarray、Series和DataFrame
  4. 【Java EE】Day07 HTML
  5. 【每日一题】【回溯backtrace】N皇后
  6. python中函数教程
  7. Python开发Brup插件检测SSRF漏洞和URL跳转
  8. python基础之hashilb模块、logging模块
  9. 创建并且配置win10系统虚拟机
  10. go-micro v3 rpc服务一次改造经历