簡體   English   中英

ASP.NET Core 中的應用程序啟動代碼

[英]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

正如您在問題中已經說過的, ConfigureConfigureServices是您自定義代碼的好地方。

我更喜歡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>();
    }
}

筆記

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM