ASP.NET MVC中服务层的@Transactional

时间:2011-06-19 21:42:09

标签: asp.net asp.net-mvc linq linq-to-sql asp.net-mvc-2

在使用Spring MVC for JAVA之后,我已经习惯在服务层中应用@Transactional行为,这对Hibernate DAO非常有效。 既然我在基于LINQ to SQL ORM的项目中遇到了类似的挑战,我发现所有事务都在DAO中发生(即使用(DC dc = new DC(){dc.submitChanges()}

如何从DAO中删除事务逻辑并将其带到ASP.NET MVC LINQ2SQL项目中的服务层?

谢谢。

1 个答案:

答案 0 :(得分:2)

它的工作非常棒,因为Spring MVC已经注册了Hibernate SessionSessionFactory并处理了创建和提交事务。您也可以在.NET中执行此操作,但您必须自己执行此操作。没有像Spring MVC为Java提供的所有这些工具的准备集成。您通常需要将DataContext实例注入服务层,而不是手动创建它。

你称之为服务层?对我来说,服务层是一个模型。在这种情况下,这些东西大部分都在ASP.NET MVC之外 - 有一种方法如何在ASP.NET MVC(custom filters)中为控制器的动作创建属性,但这不是服务层。如果您想要服务层的自定义事务属性,那么它主要意味着面向方面编程(AOP)。

你有什么选择?选择支持AOP的好IoC容器 - 例如Windsor Castle,Spring.NET,Unity 2.0或使用PostSharp for AOP。制作事务性AOP属性的简单方法是在执行带注释的方法之前创建TransactionScope,并在执行带注释的方法之后创建范围Complete。但这不是你想要的,因为你仍然需要创建DataContext实例并调用SubmitChanges。您需要AOP属性,它将创建DataContext实例将其存储在某处并执行带注释的方法。该方法将能够加载存储的上下文实例并使用它。方法完成后,AOP属性将调用SubmitChanges。唯一的问题是存储上下文实例的位置以及如何检索它 - 我相信Spring MVC在内部使用Spring并提供整个基础结构,但在.NET中你必须编写它 - 如果是Web应用程序。您必须将上下文存储在HttpContext.Items