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