程序的生命周期
1、程序的启动
在.NetCore中无论是Web项目还是控制台应用程序,启动的地方都是在Program类中的Main方法。
创建一个空Web项目可以看到Program如下(3.1版本):
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
CreateDefaultBuilder 创建一个默认的WebHost
ConfigureWebHostDefaults 配置默认的WebHost
UseStartup 启动WebHost后执行Startup
Build 生成
Run 运行
2、Startup类
在Startup类中最重要的两个方法是:
ConfigureServices 配置注入服务
Configure 配置中间件
其中Configure是必须要有的,而Startup也是非必须的,也可以把Configure写在Program类中:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Configure(app=> {
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
});
});
两者的区别在于配置的时间不同,一个实在WebHost实例化之前,一个在之后,所以在实例化之前,很多东西都还没有创建,只有最基本的参数IApplicationBuilder。
3、IHostApplicationLifetime
在2.x中是IApplicationLifetime,但是在3.x中已经废弃了。
IHostApplicationLifetime是用来监听WebHost的启动停止等操作的。
F12查看源代码,可以看到:
ApplicationStarted 启动WebHost完成触发
ApplicationStopping 结束WebHost时触发
ApplicationStopped 结束WebHost完成后触发
StopApplication 主动停止WebHost
写一个实例查看一下:
public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicationLifetime)
{
applicationLifetime.ApplicationStarted.Register(()=> {
Console.WriteLine("WebHost启动完毕触发");
});
applicationLifetime.ApplicationStopping.Register(() => {
Console.WriteLine("WebHost结束时触发");
});
applicationLifetime.ApplicationStopped.Register(() => {
Console.WriteLine("WebHost结束完毕触发");
});
app.Run(async context => {
await context.Response.WriteAsync("Hello World!");
// 主动结束
applicationLifetime.StopApplication();
});
}
执行结果:
大致的生命周期为: