我对在我的 MVC 应用程序中各处编写以下代码感到恼火。
using(var tx = new TransactionScope()){
blah...
tx.Complete()
}
我想以某种方式制作这个烘干机。
为此我想到了几个不同的选择。
- 以声明方式将某些操作标记为事务性操作的操作过滤器。
- 重写 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/