Я сейчас пишу новое приложение, хотя стандартом компании является использование NHibernate (потому что это стандарт для всех проектов), и вместо этого я использую ASP.NET MVC 3 из-за его зрелости. Я реализовал свои транзакции в контроллерах (что, якобы, так и должно быть), поэтому в моем корневом контроллере это выглядит так:
[TransactionPerRequest]
public class FbsController : Controller
{
}
Тогда все мои контроллеры наследуются от этого FbsController
. Причина в том, что 90% всех моих действий будут отправляться в базу данных, поэтому затраты на создание транзакции и ее удаление для оставшихся 10% действий (которые будут выполняться редко) не стоят украшать каждое действие [TransactionPerRequest]
.
Что меня всегда озадачивало, так это в отношении сессий NHibernate. В классах хранилища это похоже на то, что у меня есть, хотя в других проектах это не так:
public void Add(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
session.Save(user);
}
}
public void Remove(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
session.Delete(user);
}
}
public User GetById(int userId)
{
using (ISession session = NHibernateHelper.OpenSession())
{
return session.QueryOver<User>()
.Where(c => c.UserID == userId)
.SingleOrDefault();
}
}
Итак, для большинства функций в моем репозитории я должен открыть сессию. Есть ли способ избежать этого поведения, поэтому мне не нужно открывать сеанс внутри каждого метода репозитория? Это кажется немного нелогичным, так как обычно мне приходится делать это для каждого. Мне было интересно, каково было решение всех остальных для проблемы транзакций и сеансов, которая, как я вижу, замусорена вокруг кода различными способами.
Реально я хочу, чтобы мои методы хранилища выглядели следующим образом:
public void Add(User user)
{
session.Save(user);
}
public void Remove(User user)
{
session.Delete(user);
}
public User GetById(int userId)
{
return session.QueryOver<User>()
.Where(c => c.UserID == userId)
.SingleOrDefault();
}
Со всем, что решается неявно.