ASP.NET Coreのドキュメント を読んで、Startupのために選ばれた2つのメソッド、ConfigureおよびConfigureServicesがあります。
これらはどちらも、起動時に実行したいカスタムコードを配置するのに適した場所のようには見えませんでした。おそらく、DBが存在しない場合はカスタムフィールドを追加したり、特定のファイルを確認したり、データベースにデータをシードしたりする必要があります。アプリの起動時に一度だけ実行するコード。
これを行うための優先/推奨アプローチはありますか?
基本的に、このようなカスタムコードには、起動時に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
クラスを使用
質問ですでに述べたように、Configure
とConfigureServices
は、カスタムコードに適した場所です。
Startup
クラスを好むでしょう。ランタイムの観点からは、呼び出しがスタートアップで呼び出されるか、Host.Run()
呼び出しの前のどこかで呼び出されるかどうかは重要ではありません。しかし、ASP.NETフレームワークに慣れているプログラマーの観点からすると、そのようなロジックの最初の外観は_Startup.cs
_ファイルになります。すべてのサンプルとテンプレートには、Identity、Entity Frameworkの初期化などのロジックが含まれています。したがって、慣例として、初期化のものをそこに置くことをお勧めします。
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.
}
}