Разговоры о записи активных замков - PullRequest
1 голос
/ 03 января 2012

Все,

Я просмотрел источник проекта Castle Active Record (в .net) в области разговоров и разговорной сферы.Я пришел к выводу, что разговоры в активной записи не могут охватывать разные темы.Другими словами, когда я создаю диалог в потоке A и затем пытаюсь использовать ConversationalScope (используя текущий диалог, созданный в потоке A) в потоке B, где я, например, получаю доступ к отложенной коллекции в экземпляре, который был загружен в потоке AI, получим исключениепотому что SesessionFactoryHolder, который проверяет текущую область видимости потока, не найдет никаких зарегистрированных областей для потока B, потому что области потока (в формах Windows) хранятся для каждого потока (статическое поле потока).

Является ли приведенное выше понимание правильным?Если да, это не ограничивает?Разговоры должны быть в состоянии охватить разные темы.Если это правда, я хотел бы спросить несколько идей о том, как разделить сеанс гибернации (используя Castle Active Record) между несколькими потоками без написания большого количества кода.

РЕДАКТИРОВАТЬ: я хотел бы добавить к этому сообщениюПрошлое на моем последнем открытии.Вышеупомянутое утверждение, что разговор не охватывает потоки, все еще остается верным.Утверждение о невозможности загрузки отложенных коллекций в другой поток является ложным.Ленивые коллекции МОГУТ быть загружены лениво в другой поток (в этом примере в поток B).Причина, как я обнаружил, заключается в том, что, пока разговор продолжается, продолжаются сессии, и, следовательно, ленивые коллекции могут быть доступны.

РЕДАКТИРОВАТЬ 2: Я понял это.Я оставлю свой старый пост с этим ответом, чтобы другие, у кого есть вопросы по этой теме, могли получить пользу.

ОТВЕТ : В среде активной записи записей беседы могут быть разделены между потоками.В новом потоке область сеанса всегда регистрируется в следующей строке:

Область 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)
}

1 Ответ

1 голос
/ 03 января 2012

В среде активной записи замка разговоры могут быть разделены между потоками.В новом потоке область сеанса всегда регистрируется в следующей строке:

Область ConversationalScope = новый ConversationalScope (currConv)

Следовательно, текущий поток имеет допустимую область сеанса.Затем SessionFactoryHolder принудительно использует текущую область сеанса для потока (вместо использования его локального сеанса).Логика получения сеанса гибернации заключается в том, что он делегирует эту задачу диалогу, который будет возвращать последний сеанс гибернации (созданный в предыдущем потоке A).Следовательно, вы получите тот же сеанс, который был создан другим потоком, при условии, что область диалога является действительной (не удалена).

...