asp.net-mvc - 使用 Asp.Net MVC 进行自动交易的最佳方式是什么?

标签 asp.net-mvc transactions aop

我对在我的 MVC 应用程序中各处编写以下代码感到恼火。

using(var tx = new TransactionScope()){
   blah...
   tx.Complete()
}

我想以某种方式制作这个烘干机。

为此我想到了几个不同的选择。

  1. 以声明方式将某些操作标记为事务性操作的操作过滤器。
  2. 重写 Controller 基类中的 OnActionExecuting 并使所有操作一次性完成。

这些都是好主意吗?我应该注意什么问题?第二个选项似乎是产生大量死锁的好方法。

哦,是的,我还使用 StructureMap 和自定义 Controller 工厂将 dep 注入(inject)我的 Controller ,以防有人知道以这种方式注入(inject)事务的一些技巧。

最佳答案

您可以使用 Unit of Work pattern做你的交易管理。工作单元模式的主要好处是您可以将事务策略放在一个地方,或者当您有多个策略时放在几个地方。 最简单的工作单元接口(interface)可能是:

public interface IUnitOfWork
{
    void Start();
    void Commit();
    void RollBack();
}

您可以为不同的 ORM 或存储过程或硬编码的 sql 创建各种 UnitOfWork 实现。您可以在请求的开头开始事务。事务可以在请求结束时处理。在处置之前,您可以将提交包装在一个 try-catch block 中,并在 catch 中回滚。

try
{
    unitOfWork.Commit();
} 
catch
{
     unitOfWork.RollBack();
     throw;
}

事务启动策略有:

  • Per request:一个事务用于整个请求,这是大多数情况下的最佳方式。
  • 每个请求多次:每个方法一个事务。
  • 每次对话:您可以围绕购物车结账流程的多个请求创建交易。

您可以通过以下方式管理您的交易:

  • 属性
  • global.asax 中的 application_begin 和 endrequest 方法
  • http模块

使用 StructureMap 时,您可以在工作单元配置中使用混合缓存作为 InstanceScope。您可以使用 StructureMap 将工作单元注入(inject)存储库。

关于asp.net-mvc - 使用 Asp.Net MVC 进行自动交易的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/761958/

相关文章:

asp.net - 在 Visual Studio 2015 中保存 *.cs 或 *.cshtml 文件后 IIS Express 停止

java - Spring AOP 命名切入点到底是如何工作的?有何用途?

java - 在AspectJ中排除带注释的方法

php - 使用 PHP mysqli_query 的单个 SELECT 查询的隔离级别

java - 以可靠的方式归档的 JMS 消息

grails - @Transactional不适用于所有 Controller Action

java - Aspectj 切入点表达式不适用于单个类中的一种方法,但适用于另一种方法

c# - DDD认证服务

ASP.NET 身份数据库第一个自定义用户和角色

c# - MVC5模型不记录文本框的文本值