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`中間件的場景。詳細理解可自行查閱源碼,本文僅作簡要介紹。