Подтвердить что ты не робот

Управление сеансом NHibernate и ленивая загрузка

У меня есть чертовски время, пытаясь выяснить мои проблемы с управлением сеансами в NHibernate. Я предполагаю, что большая часть моей проблемы связана с отсутствием знаний о концепциях IoC и AOP; по крайней мере, это то, о чем я думаю, где Фабио Моло продолжает руководить мной.

В любом случае, моя проблема в том, что у меня есть приложение форм выигрышей, которое делает "получить" вызовы и привязывает результат к сетке. После привязки пользователь может выполнить какое-то действие "написать", и это приведет к закрытию сеанса после записи в попытке использовать концепцию сеанса для использования. Затем пользователь может прокручивать сетку, которая вызывает ленивую загрузку, и теперь сеанс закрыт, и я получаю исключение.

Я не хочу, чтобы мой взгляд был посвящен моим сеансам, я не хочу отправлять KillAllSessions, когда пользователь закрывает форму. Кроме того, пользователь может иметь несколько форм, открытых в любой момент времени, дополнительно усугубляя проблемы, связанные с этим методом. Я по сути хочу, чтобы все это работало "за кулисами".

Итак, моя идея до сих пор заключается в том, чтобы перехватить ленивый запрос на загрузку и проверить, открыт ли сеанс, а если не открывать его повторно, получите информацию, а затем снова закройте ее. Однако, насколько я могу судить, что не так много, по сути, это то, как работает ленивая загрузка. Он перехватывается прокси factory (NHibernate.Bytecode.Castle), а затем извлекает данные с помощью сеанса. Поэтому мне нужно фактически перехватить этот вызов, а затем передать его первоначальному намеченному перехвату после повторного открытия сеанса. Так что это моя идея.

Мой вопрос в первую очередь заключается в том, что это даже правильный способ сделать это? Во-вторых, если я даже не знаю, с чего начать. Я никогда не перехватывал вызовы методов, я знал это теоретически, но не на практике. Я знаю, что есть библиотеки, которые делают такие вещи, как Rhino Commons, но я хочу воспользоваться этой возможностью, чтобы учиться и стать лучшим программистом. Я пытаюсь понять AOP и Context Bound Objects, но в настоящее время я не разбираюсь в нем. Могли бы некоторые из вас, пожалуйста, помочь парню?

4b9b3361

Ответ 1

Я могу придумать несколько вариантов:

Вариант 1: сохранить исходное ISession открытым, пока пользователь взаимодействует с данными и фиксирует все изменения сразу, когда пользователь выполнен. Это означает, что у вас может быть большое количество незафиксированных изменений в памяти, а другие пользователи не будут видеть ожидающие изменения.

Вариант 2: Разделите операции на две единицы работы (UOW). UOW1 только читает и несет ответственность за заполнение списка. ISession, связанный с UOW1, остается активным, чтобы обеспечить ленивую загрузку, например, в сценарии развертки. UOW2 - это новый недолговечный ISession, созданный для пользовательских прав. Когда редактирование завершается, исходный объект вызывается из UOW1, а UOW1 выбирает новую копию из базы данных.

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

Ответ 2

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

Всякий раз, когда я пишу в базу данных, я использую транзакцию begin/commit, которая не закрывает основной сеанс. соединение с базой данных открывается NHibernate только во время транзакции.

Есть ли причина, по которой вам нужно закрыть сеанс, пока пользователь активно использует форму?

Можете ли вы предоставить более подробную информацию о том, что вы используете для управления своим сеансом, шаблоном репозитория,... и т.д.?