2009-07-11 2 views
1

Предположим, у меня есть простой вид, который отображает имя продукта и прекращено ли оно. Я извлекаю данные из базы данных Northwind. Я использую простой шаблон представления модели и шаблон DAO с NHibernate. Когда загружается форма, у меня есть свой пользовательский интерфейс с кнопкой «Загрузить» и кнопкой «Сохранить». Если я нажал кнопку «Загрузить», чем в моем коде, я просто передаю вызов своему ведущему, чтобы загрузить данные. Презентатор вызывает DAO для получения данных и заполнения данных данными. Чем я нажал кнопку «Сохранить». снова мой код за спиной передает вызов ведущему. Ведущий должен иметь объект сеанса, который был создан на Load, чтобы сделать оптимистичный параллелизм, отслеживать изменения и т. Д. ...Nhibernate и ISession

Итак, мой вопрос в том, где я могу создать свой объект ISession, чтобы он мог отслеживать изменения и оптимизировать параллелизм?

ответ

0

HTTP не имеет гражданства. Ваша единица работы существует только на стороне сервера. Что касается нажатия «Загрузить», то ваше UOW просто извлекает запись и сопоставляется с вашей моделью просмотра. «Сохранить» и блок работы запускаются, когда вы нажимаете на сервер, вместо того, чтобы быть в курсе нагрузки, редактировать в браузере, а затем обратно на сервер.

Реализация разумна, вы не должны хранить ISession в памяти (в вашем случае объект сеанса ASP.Net), это быстрый способ исчерпать память и неуправляемые ресурсы ado.net. Существуют различные примеры UOW, которые некоторые люди предпочитают связывать ISession с HTTP-контекстом в begin_request и располагать end_request, вы, конечно, можете быть более гранулированными, но во всех случаях он никогда не существует дальше этого.

В упрощенной системе, нажав кнопку «Сохранить», вам нужно вытащить продукт из базы данных с помощью идентификатора (скрытого поля или чего нет), установить свойства из Request.Form и затем обновить в базы данных.

Что касается параллелизма. Если записать метку или версию приращения в скрытом поле

<input type="hidden" name="version" value="12"/> 

Затем, когда вы нажмете кнопку Сохранить, вы тянуть продукт из базы данных, убедитесь, что номер версии в Request.Form матчах, а затем сохранить, если вы не вернетесь к пользователю, что данные изменились с момента последнего получения, вы бы хотели продолжить? NHibernate имеет поля timestamp/version, поэтому сравнение выполняется, когда вы на самом деле нажимаете DB в основном предложение where в Update, поэтому в этом случае он даже учитывает изменения до момента, когда вы совершаете.

Есть более сложные и сложные способы, но обычно вы не можете/не должны вставлять ISession в свой объект Session asp.net.

+0

Не думайте о веб-приложениях. Мне интересно об использовании winform. извините за то, что я не указал, что в моем вопросе – codemnky

+0

Неплохо, создайте свой ISession при запуске приложения, закройте его. Предположительно, ваши операторы базы данных не являются потоковыми, это должно быть хорошо. Используйте диспетчер singleton, если вы посмеете – 2009-07-12 16:46:07

+0

Хотя я могу подтвердить тот факт, что создание одного сеанса для срока службы приложения работает, оно не рекомендуется большинству экспертов nHibernate. Я считаю, что проблема с использованием памяти связана с кешированием и потенциальными проблемами, если выбраны исключения или вам нужно отменить транзакцию. –

0

Поскольку вы используете MVP, я предполагаю, что это настольное приложение, а не веб-приложение. UnitOfWork - хороший шаблон для этого, так же как и «Persistent Conversation». Айенде недавно написал замечательную статью о building a desktop application with nhibernate, поэтому я определенно посмотрю на это.

Смежные вопросы