在请求结束时,我如何在控制器内执行某些操作
本文关键字:执行 操作 控制器 结束 请求 | 更新日期: 2023-09-27 18:28:10
我想在控制器请求结束时,即在呈现视图和所有视图之后,处理NHibernate Session对象。我应该在哪里做?
您可以创建自己的自定义操作过滤器并覆盖OnResultExecuted。
只是为了在控制器请求结束时做出反应,对NHibernate了解不多。
编辑:正如jgaufin中提到的,你也可以在控制器中覆盖OnResultExecuted。
处理您的NHibernate会话不是您的控制器的责任。理想情况下,在处理存储库时,它需要是您的存储库或/和IoCContainer。和上面的答案一样,我对NHibernate不太了解,但我会遵循这种模式。
这是一篇很长的帖子,但我做了一些类似的事情:-
在我的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,因为它可以帮助您理解会话管理(也就是说,如果设置不正确)。