翼度科技»论坛 编程开发 .net 查看内容

ASP.NET Core - .NET 6 的入口文件

15

主题

15

帖子

45

积分

新手上路

Rank: 1

积分
45
自从.NET 6 开始,微软对应用的入口文件进行了调整,移除了 Main 方法和 Startup 文件,使用顶级语句的写法,将应用初始化的相关配置和操作全部集中在 Program.cs 文件中,如下:
  1. var builder = WebApplication.CreateBuilder(args);
  2. // Add services to the container.
  3. builder.Services.AddControllers();
  4. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  5. builder.Services.AddEndpointsApiExplorer();
  6. builder.Services.AddSwaggerGen();
  7. var app = builder.Build();
  8. // Configure the HTTP request pipeline.
  9. if (app.Environment.IsDevelopment())
  10. {
  11.     app.UseSwagger();
  12.     app.UseSwaggerUI();
  13. }
  14. app.UseAuthorization();
  15. app.MapControllers();
  16. app.Run();
复制代码
关于顶级语句语法的规范,大家可以通过官方文档了解一下:顶级语句。这种改变怎么说呢,我自己是挺不习惯的,虽然这种方式更加简洁,但是过于简洁也容易让人一脸懵,还是觉得之前的Startup文件的方式根据逻辑清晰一点,也更能做到关注点分离。
.NET 6 下应用的构建有了一些区别,不再直接使用原来的 Host 进行配置构建,而是通过 WebApplication 的静态方法构建 WebApplicationBuilder 来对主机进行配置,其实内部是 BootstrapHostBuilder 来进行的,调用 BootstrapHostBuilder 的相关配置方法时,只是将委托保存起来,之后还是通过 HostingBuilder 来进行配置。


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

而最终调用 WebApplication 对象的 Run 方法启动应用时,也是调用了主机的 StartAsync 方法,只是进行了一层包装,微软团队这样处理的好处暂时还不能很好得体会到。但总的来说改变也不大,虽然没了Startup类,但整体框架的基本模型并没有改变,之前能够在 Startup 中拿到的东西,在现在的入口文件中依旧可以拿到,我们依旧可以自由地控制整个请求管道,把握整体应用生命周期行为。
以下是 WebApplicationBuilder 对象 builder 张包含的几个关键实例
  1. // builder 中可以获取到的几个关键实例
  2. // 依赖注入容器
  3. IServiceCollection service = builder.Services;
  4. // 配置
  5. IConfiguration configuration = builder.Configuration;
  6. // 日志
  7. ILoggingBuilder loggingBuilder = builder.Logging;
  8. // 主机
  9. IHostBuilder host = builder.Host;
  10. IWebHostBuilder webHost = builder.WebHost;
  11. // 环境
  12. IWebHostEnvironment env = builder.Environment;
复制代码
现在的依赖注入配置,直接通过 builder.services进行配置即可
  1. // 依赖注入,相当于 Startup 中的ConfigureService方法
  2. builder.Services.AddControllers();
  3. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
  4. builder.Services.AddEndpointsApiExplorer();
  5. builder.Services.AddSwaggerGen();
复制代码
日志驱动配置:
  1. // 日志提供程序配置,相当于之前主机中的 hostBuilder.ConfigureLogging
  2. builder.Logging.AddConsole().AddDebug();
复制代码
以下是 WebApplication 对象 app 中包含的几个关键实例
  1. // app 中包含的几个关键实例
  2. // 环境
  3. IWebHostEnvironment enviroment = app.Environment;
  4. // 配置
  5. IConfiguration config = app.Configuration;
  6. // 应用生命周期
  7. IHostApplicationLifetime lifetime = app.Lifetime;
  8. // 日志记录器
  9. ILogger logger = app.Logger;
  10. // 容器解析器
  11. IServiceProvider serviceProvider = app.Services;
复制代码
在执行完成 builder.Build(); 之后,应用已经初始化了依赖注入容器,所以我们可以通过 app.services获取我们需要的实例。
  1. // 通过容器获取实例
  2. 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

来源:https://www.cnblogs.com/wewant/archive/2023/02/13/17107469.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具