すべて、城のアクティブなレコードの会話
私は会話と会話の範囲の城のアクティブレコードプロジェクト(.net)のソースを見てきました。私はアクティブレコードの会話が別のスレッドにまたがることはできないと結論付けました。つまり、スレッドAで会話を作成し、ConversationalScope(スレッドAで作成された現在の会話を使用)を使用しようとすると、たとえばスレッドAIでロードされたインスタンスのレイジーコレクションにアクセスするスレッドBで例外が発生します現在のスレッドスコープをチェックするSesessionFactoryHolderは、スレッドスコープ(ウィンドウ形式)がスレッド(スレッド静的フィールド)ごとに格納されるため、スレッドBの登録スコープは検出されないためです。
上記の理解は正しいですか?はいの場合は、これに限定されませんか?会話は、異なるスレッドにまたがることができるはずです。そうだとすれば、たくさんのコードを書くことなく、複数のスレッド間で休止状態のセッション(Castle Active Recordを使用)を共有する方法をいくつか考えてみたいと思います。
編集:私はこの記事に私の最新の知見を追加したいと思います。会話がスレッドにまたがっていないという上記のステートメントは、依然として真です。別のスレッドで遅延コレクションをロードできないという声明は偽です。レイジーコレクションを別のスレッド(この例ではスレッドB)に遅延ロードすることができます。私が発見したこの理由は、会話が長くなるにつれてセッションも長くなるため、怠惰なコレクションにアクセスできるからです。
編集2:私はそれを理解しました。私はこの回答で私の古い投稿を残すので、このトピックについて質問をしている他の人にとって有益です。
ANSWER:キャッスルアクティブレコードフレームワークの会話はスレッド間で共有できます。
ConversationalScopeスコープ=新しいConversationalScope(currConv)
したがって、現在のスレッドが有効なセッションスコープを持っている:何が起こるかというと、セッションスコープは、常に次の行に登録されている新しいスレッドでということです。 SessionFactoryHolderは、そのローカルセッションを使用するのではなく、スレッドの現在のセッションスコープを強制的に使用します。休止状態のセッションを検索するロジックは、このタスクをスレッドに委譲し、最後の休止状態のセッション(前のスレッドAで作成されたセッション)を返すことです。したがって、会話スコープが有効である(廃棄されていない)場合、別のスレッドによって作成された同じセッションを取得します。城アクティブレコードフレームワークの会話で
Thread A: IScopeConversation conv = new ScopedConversation(); var order = null; using (ConversationalScope scope = new ConversationalScope(conv)) { order = Order.Load(1); } // spawn/run thread B, access lazy collection on order Thread B: using (ConversationalScope scope = new ConversationalScope(conv)) { IList orderDetails = order.Details; // will NOT cause exception since the conversation is still valid (has not been disposed) }