ASP.NET MVC и NHibernate соединение - PullRequest
2 голосов
/ 19 апреля 2010

Я только начал изучать NHibernate.

За последние несколько месяцев я использовал IoC / DI (структурную карту) и шаблон репозитория, и это сделало мои приложения гораздо более свободными и проще для тестирования.

Когда я переключил свой слой персистентности на NHibernate, я решил придерживаться своих репозиториев. В настоящее время я создаю новый сеанс для каждого вызова метода, но, конечно, это означает, что я не могу извлечь выгоду из отложенной загрузки.

Поэтому я хочу реализовать сеанс по запросу, но при этом мой веб-проект будет зависеть от NHibernate (возможно, это не так уж плохо?). Я планировал внедрить ISession в свои репозитории и создавать и размещать сеансы по событиям beginrequest / endrequest (см. http://ayende.com/Blog/archive/2009/08/05/do-you-need-a-framework.aspx)

Это хороший подход? Предположительно я не могу использовать сеанс на запрос без ссылки на NHibernate в моем веб-проекте?

Зависимость веб-проекта от NHibernate вызывает у меня следующие (несколько) вопросы - зачем вообще беспокоиться о репозитории? Поскольку мое веб-приложение вызывает сервисы, которые общаются с репозиториями, почему бы не отключить репозитории и просто добавить мой код персистентности NHibernate внутри сервисов? И, наконец, есть ли необходимость делиться на множество проектов. Достаточно ли веб-проекта и инфраструктурного проекта?

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

Большое спасибо, Бен

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Взгляните на S # arp Architecture . Он отвечает всем, что вам нужно, включая разделение слоя данных (NHibernate), веб-слоя и бизнес-логики.

1 голос
/ 19 апреля 2010

Я бы не делал бизнес-логику зависимой от NHibernate. Я написал (более или менее простой) класс для создания сеанса в контексте:

using (TransactionService.CreateTransaction())
{
  // use repository here

  // rollback on exception, only commit when reach this last line:
  TransactionService.Commit();
}

Вы просто получаете IDisposable, вам не нужно знать сеанс.

Репозитории получают API для доступа к сеансу. Например:

// example repository implementation
public Entity Get(Guid id)
{
  return SessionProvider.Session.Get<Entity>(id);
}

Для реализации этого я помещаю сеанс в переменную ThreadStatic, которая инициализируется в CreateTransaction и возвращается SessionProvider.Session.

0 голосов
/ 19 апреля 2010

Возможно, вы захотите взглянуть на класс TransactionScope:

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...