私はAsp.Net MVCアプリケーションを構築しています。私はEntity Framework Coreをデータベースアクセスに使用しました。私はデータベースにSQLServerを使用しています。すべてのEFスタッフはコントローラのメソッドの内部からうまく動作します。エンドポイントとDbContextに同じトランザクションを使用
また、Webサーバーで実行する必要のないものを処理する、関連するNServiceBusサービスアプリケーションもあります。一般的なことの1つは、タイムアウト後にタスクを実行することです。 (例えば、ユーザーがウェブサイト上で何かをしてから30分後に何かします)。
サービスバスのセットアップとEntity Frameworkデータと同じデータベースを使用するSQLトランスポートを使用しています。
WebサーバーはNServiceBusメッセージを処理する必要がないため、IOCコンテナに登録されたIEndpointInstanceのみが送信されます。 NServiceBusメッセージを送信する必要があるコントローラは、IEndpointInstanceを取得し、これを使用して送信します。
コントローラのクライアント要求を処理し、EFを使用してデータベースを変更し、エンドポイントを使用してNServiceBusメッセージを送信しますが、問題があります。 EFとNServiceBusの両方が同じSQLデータベースを使用してデータとメッセージを格納していますが、これらのタスクは同じデータベーストランザクションの一部ではありません。これは、EFがデータベースへの変更を保存するために問題が起こった場合に、NServiceBusメッセージの送信が完了せず、データとメッセージが一貫性のない状態になるという問題があることを意味します。
問題は、どのようにIEndpointInstanceをEF DbContext Saveと同じトランザクション内で送信するのですか?
私は、EndPoint Transportを構成するときに、私が使用できるUseCustomSqlConnectionFactory拡張メソッドがあることを発見しました。私はIOCコンテナからWebリクエストスコープで使用されるDbContextを取得し、そのSqlConnectionを抽出してエンドポイントに提供するファクトリを提供することができました。ここでの問題は、IEndpointInstance.Sendから返されたTaskは、送信が完了するための.Wait()が返されないことです。
IMessageHandlerContextに含まれるトランザクションをEFで共有する方法についての豊富なドキュメントや例がありますが、IEndpointInstanceを取得してEFとトランザクションを共有する方法については何も見つかりません。
私は何かが欠けています。 IEndpointInstance.Send()を呼び出すまで動作は呼び出されません。これは、作業ユニットがそれまでに拡張機能に追加されていないことを意味します。同様に、どのようにしてExtensionsにアクセスするのですか?Send()が呼び出される前に取得しますか? –
私のMVCコントローラで達成しようとしているプロセスは次のとおりです。 1.ビジネスデータDBコンテキストクエリ 2.終了するか続行するか決定します 3.ビジネスデータDBコンテキストを更新します 4.メッセージを送信します。 だから、その接続が送信まで動作で公開されていない場合、エンドポイントインスタンスから接続オブジェクトを使用してビジネスDBコンテキストを作成するにはどうすればよいですか? –
@WilliamLeaderその場合、TransactionScopeのヘルプはありませんか?メッセージ+ビジネスデータが含まれているデータベースを同じ接続文字列で共有する限り、(DTCにエスカレートせずに)両方が同じトランザクションに参加します。 –