Длинный пост, но я делаю что-то вроде: -
В моем global.asax.cs
public static ISessionFactory SessionFactory { get; set; }
, а затем определить в запуске приложения
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
var nhConfig = new Configuration().Configure();
SessionFactory = nhConfig.BuildSessionFactory();
}
Этот класс затем создается: -
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class NHSession : ActionFilterAttribute
{
public NHSession()
{
Order = 100;
}
protected ISessionFactory sessionFactory
{
get
{
return MvcApplication.SessionFactory;
}
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
session.BeginTransaction();
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var session = CurrentSessionContext.Unbind(sessionFactory);
if (session != null)
{
if (session.Transaction.IsActive)
{
try
{
session.Transaction.Commit();
}
catch
{
session.Transaction.Rollback();
}
}
session.Close();
}
}
}
Тогда мой общий репозиторий выглядит примерно так: -
public class Repository<T> : IRepository<T>
{
private readonly ISessionFactory SessionFactory;
public Repository(ISessionFactory sessionFactory)
{
SessionFactory = sessionFactory;
}
public ISession Session
{
get
{
return SessionFactory.GetCurrentSession();
}
}
public T Get(long id)
{
return Session.Get<T>(id);
}
}
Моя конкретная реализация хранилища: -
public class CmsContentRepository : Repository<CmsContent>, ICmsContentRepository
{
public CmsContentRepository(ISessionFactory sessionFactory) : base(sessionFactory) { }
}
И еще одна вещь, которую я тогда украшаю своими контроллерами так: -
[NHSession]
public ViewResult Revisions(int id)
{
var model = Service.CmsContentRepository.Get(id);
return View("Revisions", model);
}
Это дает мне возможность использовать единицу работы в запросе. В основном, запрос приходит и запускает сессию, сессионная фабрика передается в ctor репозитория (ов) ... Я здесь использую DI, но это необязательно. Если обнаружена ошибка, то сеанс откатывается, если нет, он фиксируется в конце запроса. Я бы порекомендовал NHProf, так как он поможет вам разобраться с управлением сеансами (то есть, если он настроен неправильно).