依存性注入によるバックグラウンドタスクのためのDbContext

asp.net-core asp.net-core-mvc background-process dependency-injection entity-framework-core

質問

私はおそらく正しい方向に考えていないでしょう。私は、Dependency InjectionとASP.Net Coreについてはかなり新しいです。

私はASP.NetコアのWebサイトを持っており、その1つはExcelシートからユーザーがアップロードするデータベースにデータをインポートすることです。 Excelシートは膨大なものになる可能性があり、データ変換タスクは時間を要するため、バックグラウンドで実行したいと考えています。つまり、ユーザーがシートをアップロードすると、応答がすぐに送信され、バックグラウンドジョブ/スレッドがデータをインポートします。

バックグラウンドジョブを実行しようとしています:

Task.Run(() => ProcessImport(model));

私が実行する問題は、Processインポートメソッドが、Scopedとして追加されたASP.Net Dependency Injection Containerを介してAppDbContextにアクセスするリポジトリクラスを持つサービスを呼び出し、応答が返されるとコンテキストが破棄されることです。実行時例外が発生しましたが、その処理後にコンテキストを使用することはできません。

私の質問は、この状況を処理する最善の方法は何ですか?私はAppDbContextシングルトンを作るべきですか?私はProcessImportメソッドでAppDbContextの新しいインスタンスを作成し、それを渡す必要がありますか?私はDbContextはスレッドセーフではないので、それは良いアプローチですか?

受け入れられた回答

IServiceScopeFactoryインスタンス(シングルトン)をタスクに渡す必要があります。

タスクの中で、データが到着したら、新しいCreateScope()を作成し、そのスコープからサービスを要求する必要があります。データ処理が終了したら、このスコープをIServiceScopeFactoryします(ただし、次の実行にはIServiceScopeFactoryへの参照を保持します)。

例えばこれを見てください。私はこのライブラリで小さくて速いタスクを実行します。

Gertが書いたように、重い/長時間の作業の場合、あなたの仕事は常に完了するまで頼りにしないでください。再始動の準備をして、同じデータを再処理する準備をしてください。


人気のある回答

あなたの質問を分解するには:

  1. この状況を処理する最善の方法は何ですか?

    APIが長時間実行するタスクを処理することは理想的ではありません。プロセスをバックグラウンド・アプリケーションに委譲することができます

  2. 私はAppDbContextシングルトンを作るべきですか?

    dbContextは、トランザクション管理のような問題を引き起こす可能性があるため、Webアプリケーションのシナリオではシングルトンであってはなりません。

  3. この状況を処理する最善の方法は何ですか?

    さまざまなサービス/プロセスの内訳:

    • ファイルを取得するAPI。理想的には、APIはファイルを入力として取り出し、それをディスクまたはデータベースに保持するだけです。
    • ファイルを処理するサービス。このコンポーネント/サービスを別のライブラリとして作成します。その後、コンソールアプリケーションからこのライブラリを使用します。これにより、パフォーマンスをプロファイルできます。それを非同期メソッドにすることによって、メソッドを忘れて起動させます。これにより、コードを再利用する柔軟性が得られます。
    • たくさんのファイルアップロードが必要ない場合は、APIコントローラでライブラリを再利用し、QueueBackgroundWorkItemを使用してメソッドを実行できます。参考までにここをクリックしてください: http : //www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
  4. 私はProcessImportメソッドでAppDbContextの新しいインスタンスを作成し、それを渡す必要がありますか?

    スレッドセーフではないため、各スレッドでdbContextクラスのインスタンスを個別に作成して使用してください。

  5. 私はDbContextはスレッドセーフではないので、それは良いアプローチですか?

    EF dbContextを使用するための詳細なガイドについては、このブログをチェックアウトしてくださいhttp ://mehdi.me/ambient-dbcontext-in-ef6/



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ