ASP.NET MVC中的nHibernate会话范围 - 请求还是动作?

时间:2011-09-14 21:46:28

标签: asp.net-mvc asp.net-mvc-3 nhibernate structuremap

ASP.NET MVC中的会话事务应该是按请求还是按行动,如果它们应该是每个操作(我认为它们应该是),那么当通过IoC控制会话时,如何确定每个操作的范围(我正在使用StructureMap作为我的Dependency Resolver)? IoC容器中大多数范围生命周期的实现都是按照HttpContext和/或每个线程进行的,我认为它们是最精细的设置,但是mvc请求可以通过子操作进行多个操作。我想过在我的action属性中请求会话工厂控制我的事务并从中创建一个会话,但是你如何确保数据存储库使用与它们被访问的操作相同的会话?

2 个答案:

答案 0 :(得分:1)

我认为最直接的方法是使用工厂方法和每个请求范围。然后在实际需要时创建会话,并在请求结束时保持活动状态。

例如,如果您有延迟加载属性,则每个请求只使用一个会话会使事情变得更容易。

我不知道StructureMap,但是使用Castle Windsor我只需要一行

container.Register<ISession>(c => c.Resolve<ISessionFactory>().OpenSession(), LifeStyle.PerRequest);

会话就像魅力一样。

答案 1 :(得分:0)

我最终在全局级别使用添加​​到MVC的属性,这将为每个Action上下文提供一个新会话。我从中获取信息 http://ayende.com/blog/4809/refactoring-toward-frictionless-odorless-code-what-about-transactionshttp://slynetblog.blogspot.com/2011/04/lightweight-nhibernate-and-aspnet-mvc.html