web-dev-qa-db-ja.com

ASP.NET Coreのアプリケーションスタートアップコード

ASP.NET Coreのドキュメント を読んで、Startupのために選ばれた2つのメソッド、ConfigureおよびConfigureServicesがあります。

これらはどちらも、起動時に実行したいカスタムコードを配置するのに適した場所のようには見えませんでした。おそらく、DBが存在しない場合はカスタムフィールドを追加したり、特定のファイルを確認したり、データベースにデータをシードしたりする必要があります。アプリの起動時に一度だけ実行するコード。

これを行うための優先/推奨アプローチはありますか?

30
Kyle Ballard

基本的に、このようなカスタムコードには、起動時に2つのエントリポイントがあります。

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_ファイルになります。すべてのサンプルとテンプレートには、Identity、Entity Frameworkの初期化などのロジックが含まれています。したがって、慣例として、初期化のものをそこに置くことをお勧めします。

10
Ralf Bönning

OPに同意します。

私のシナリオは、サービスレジストリにマイクロサービスを登録したいが、マイクロサービスが実行されるまでエンドポイントが何であるかを知る方法がないことです。

ConfigureメソッドもConfigureServicesメソッドも、どちらもこの種の処理を実行するように設計されていないため、理想的ではないと感じています。

別のシナリオとして、キャッシュをウォームアップしたい場合がありますが、これもやりたいことがあります。

受け入れられた答えにはいくつかの選択肢があります。

  • Webサイトを開始する前にプログラムでデータベースの更新を適用する展開ツールなど、Webサイトの外部で更新を実行する別のアプリケーションを作成します。

  • Startupクラスで、静的コンストラクターを使用して、Webサイトを開始する準備ができていることを確認します

更新

私の意見では、IApplicationLifetimeインターフェイスを次のように使用するのが最善です。

public class Startup
{
    public void Configure(IApplicationLifetime lifetime)
    {
        lifetime.ApplicationStarted.Register(OnApplicationStarted);
    }

    public void OnApplicationStarted()
    {
        // Carry out your initialisation.
    }
}
17
Matthew Bonner