netcore编译前执行代码
1. asp.net core入门之Startup
ASP.NET Core入门之Startup解析
Startup是ASP.NET Core应用程序的启动入口。在.NET 5及之前版本,通常通过startup.cs类进行程序初始化构造。而在.NET 5之后,操作简化,可以直接在Program类的主函数中构造配置Startup,或采用顶级语句方式直接编写。
在startup配置中,`var app = builder.Build();`之前的代码负责应用初始化,包括依赖注入和配置加载等操作,对应于startup.cs中的`ConfigureServices`方法。随后的配置步骤则是中间件设置,对应于`Configure`方法。新版中,`UseRouting`和`UseEndpoints`用于注册路由中间件的调用不再显式,因为最小托管模型下终结点路由中间件已包装整个中间件管道,故无需再调用。`app.MapRazorPages();`相当于调用了`app.UseRouting();`和`app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); });`。
了解扩展Startup的方法,`IStartupFilter`接口用于扩展Startup功能。它允许在不显式注册默认中间件的情况下添加默认值到管道的开头,实现配置请求管道。每个`IStartupFilter`可以在管道中添加一个或多个中间件。筛选器按照添加顺序调用,可在中间件之前或之后添加,从而附加到应用管道的开头或末尾。
通过实践,首先创建ASP.NET Core模板,包含Program文件。接下来添加`IStartupFilter`实现,用于控制台输出执行内容。在Program中注册`StartupFilterOne`,启动程序后可见中间件正常执行。多个`IStartupFilter`实现时,执行顺序与注入顺序相关。新增`StartupFilterTwo`并修改Program代码,发现是先执行`StartupFilterTwo`中的中间件,然后执行`StartupFilterOne`。
中间件注册在管道头部或尾部,调整`StartupFilterTwo`代码将`next(builder)`放在前面执行,可观察到效果变化。在管道尾部执行中间件时,若为终结点中间件,后序中间件可能不会执行。
讨论IStartupFilter的应用场景,适用于模块化开发方案、请求头部管道的校验或数据处理、请求管道尾部的特殊处理,如404错误页面处理等。
注意事项强调IStartupFilter只能注册在管道头部或尾部,确保中间件使用顺序正确。若需要在管道中间插入中间件,请使用正常的`app.use`配置。
介绍IHostingStartup概念,可在启动时从外部程序集向应用添加增强功能,如实现代码0侵入的扩展服务。创建`StartupHostLib`类库,添加`Microsoft.AspNetCore.Hosting`包,新增实现`IHostingStartup`的类库。注意添加标记以识别`HostingStartup`,否则无法识别。在`LearnStartup`中引用项目,并在`launchSettings`环境变量中添加`ASPNETCORE_HOSTINGSTARTUPASSEMBLIES`配置。启动项目后发现`HostingStartup`执行顺序优先于应用,但会覆盖应用中间件管道,导致原有中间件消失。通过调整配置和依赖注入,可确保应用中间件正常工作。
总结IHostingStartup的应用场景,适用于代码0侵入场景,如AOP数据收集,无需中间件的场景或符合`IStartupFilter`中间件的场景。详细理解可自行查阅源码,本文仅作简要介绍。