【问题标题】:@Transactional in service-layer in ASP.NET MVCASP.NET MVC 服务层中的@Transactional
【发布时间】:2011-09-18 07:34:55
【问题描述】:

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    什么叫服务层?对我来说,服务层是一个模型。在这种情况下,这些东西大多在 ASP.NET MVC 之外——有一种方法可以在 ASP.NET MVC (custom filters) 中为控制器的操作创建属性,但这不是服务层。如果您想要为服务层自定义事务属性,则主要是指面向方面的编程(AOP)。

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

    【讨论】:

    • 澄清一下......在我的上下文中,服务层提供了一个方法 API,反过来,它可能必须触发 DAO 上的一系列方法删除、删除连接等。服务类是普通对象(即 Java 中的 POJO)。在我的上下文中,服务层不是一组控制器,而是控制器使用的业务逻辑的抽象。服务可以选择缓存某些 DAO 响应并为重复的数据查询等提供优化。我使用 StructureMap for IoC。
    • 同样的答案仍然有效。你想要属性/注释吗?然后通过拦截/AOP 检查 StructureMap 是否支持这一点。如果您可以在没有属性的情况下生活,请在您的服务层操作中创建上下文并将其传递给 DAO。一旦所有 DAO 完成他们的工作,就在您的服务操作中提交更改。
    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2012-01-10
    • 2011-10-10
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多