2017-06-19 4 views
0

我々セットアップできConsume Observer使用して、以下の方法でMassTransitメッセージインターセプタ(オブザーバー)を作成する方法スコープ生涯

私は/埋めるかかりや取り扱い前にいくつかのオブジェクトを初期化することができるようにMessageConsumerInterceptorにスコープライフスタイルを適用したい
busControl.ConnectConsumeObserver(container.GetInstance<MessageConsumerInterceptor>()); 

メッセージ。そして、メッセージハンドラまたはコンシューマを介してそのオブジェクトにアクセスできます。今私はMassTransitを使ってこれをどのように達成できますか?

あなたのお手伝いやご提案をお待ちしております。

ありがとうございます。

答えて

0

オブザーバーはこれには適していません。オブザーバーは観察するだけで、状態を変更したり、メッセージ処理に影響を与えるべきではありません。

あなたが見ているのはミドルウェアです。

カスタムミドルウェアの作成方法と適用方法については、documentation pageをご確認ください。

あなたのフィルタでSendメソッドパラメータとしてConsumeContextを取得し、そこにあなたが消費者の内、後でこのデータをフェッチすることができますので、あなたは、コンテキストに何かを追加する方法GetOrAddPayload<T>TryGetPayloadを使用することができます。

+0

すぐに対応していただきありがとうございます。私もミドルウェアを試しました。私の視点から見ると、コンシューマーとミドルウェアは異なるスレッド上で動作し、その結果、スコープライフサイクルはそれらの間では不可能になる可能性があります。どう思いますか? – Hasibul

+0

私が知る限り、スコープはメッセージごとに開かれているので、動作するはずです。さらに、パイプは定義上、互いに呼び出すフィルタで構成されています。消費者はそのうちの一つです。私はなぜ彼らが異なるスコープにあるべきであるかわかりません。 –

+0

私はMiddleware-Filterで試したことがありますが、運はありません。私はコンテキストの外でScopedの生涯オブジェクトを使用することができないという例外を与えています。次の例外があります MyRequestInfoは「非同期スコープ」ライフスタイルとして登録されていますが、インスタンスはアクティブ(非同期スコープ)スコープのコンテキスト外で要求されています。 スコープライフタイムが実装されているリンクまたはサンプルを取得することはできますか?私は、消費者を開始する前に、あるオブジェクトにある価値を設定したい。 – Hasibul

関連する問題