[英]Application startup code in ASP.NET Core
通讀ASP.NET Core的文檔,有兩種用於啟動的方法:Configure 和 ConfigureServices。
這些似乎都不是放置我想在啟動時運行的自定義代碼的好地方。 也許我想在我的數據庫中添加一個自定義字段,如果它不存在,檢查特定文件,將一些數據種子到我的數據庫等。我想運行一次的代碼,就在應用程序啟動時。
是否有首選/推薦的方法來執行此操作?
我同意 OP。
我的場景是我想向服務注冊表注冊一個微服務,但在微服務運行之前無法知道端點是什么。
我覺得 Configure 和 ConfigureServices 方法都不理想,因為它們都不是為了執行這種處理而設計的。
另一種情況是想要預熱緩存,這也是我們可能想要做的事情。
接受的答案有幾種選擇:
創建另一個在您的網站之外執行更新的應用程序,例如部署工具,它在啟動網站之前以編程方式應用數據庫更新
在您的 Startup 類中,使用靜態構造函數來確保網站已准備好啟動
更新
在我看來,最好的做法是像這樣使用 IApplicationLifetime 接口:
public class Startup
{
public void Configure(IApplicationLifetime lifetime)
{
lifetime.ApplicationStarted.Register(OnApplicationStarted);
}
public void OnApplicationStarted()
{
// Carry out your initialisation.
}
}
基本上,此類自定義代碼在啟動時有兩個入口點。
1.) Main
方法
由於 ASP.NET Core 應用程序已經使用了舊的Main
方法作為入口點,因此您可以在 ASP.NET Core 啟動內容之前放置代碼,例如
public class Program
{
public static void Main(string[] args)
{
// call custom startup logic here
AppInitializer.Startup();
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
2.) 使用你的Startup
類
正如您在問題中已經說過的, Configure
和ConfigureServices
是您自定義代碼的好地方。
我更喜歡Startup
課程。 從運行時的角度來看,調用是在啟動時還是在host.Run()
調用之前的其他地方調用並不重要。 但是,從習慣於 ASP.NET 框架的程序員的角度來看,他首先要尋找這樣的邏輯將是Startup.cs
文件。 所有示例和模板都將用於標識、實體框架初始化等的邏輯放在那里。 所以作為慣例,我建議將初始化的東西放在那里。
這可以通過創建IHostedService
實現並在啟動類的ConfigureServices()
中使用IServiceCollection.AddHostedService<>()
注冊它來完成。
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
public class MyInitializer : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
// Do your startup work here
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
// We have to implement this method too, because it is in the interface
return Task.CompletedTask;
}
}
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyInitializer>();
}
}
IHostedService
實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.