zoukankan      html  css  js  c++  java
  • 实例讲解PostSharp(二)

    添加事务
    有些方法可能需要事务支持,我们可能希望事务和业务分开的,也就是说当编写业务代码时根本就不用关心事务,下面我们看一个场景,一个银行帐

    户管理类中有一个用于转账的方法,代码如下:

    Code
    class AccountManager
        {
            
    public void Trans(Account a1, Account a2,decimal money)
            {

                a1.Money 
    = a1.Money - money;
                a2.Money 
    = a2.Money + money;
                Update(a1.AccoutID, a1);
                Update(a2.AccoutID, a2);
            }
            
    public void Update(int id,Account account)
            {
                
    using (DataClasses1DataContext dc=new DataClasses1DataContext())
                {
                    var a 
    = dc.Account.First(t => t.AccoutID == id);
                    a.Money 
    = account.Money;
                    dc.SubmitChanges();

                }
            }
        }

    现在我不想修改这部分代码但希望Trans方法是一个事务,下面我们使用PostSharp来实现:
    首先引入PostSharp.Laos,PostSharp.Public两个程序集,另外还需引入System.Transactions程序集,添加TransactionScopeAttribte类:

    Code
    [Serializable]
        
    class TransactionScopeAttribte : OnMethodBoundaryAspect
        {
       
            
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
            {
                TransactionOptions transactionOptions 
    = new TransactionOptions();
                TransactionScopeOption transactionScopeOption 
    = TransactionScopeOption.Required;
                EnterpriseServicesInteropOption interopOption 
    = EnterpriseServicesInteropOption.Automatic;
                eventArgs.MethodExecutionTag 
    = new TransactionScope(transactionScopeOption, transactionOptions, interopOption);
            }
            
    public override void OnExit(MethodExecutionEventArgs eventArgs)
            {
                TransactionScope transactionScope 
    = (TransactionScope)eventArgs.MethodExecutionTag;
                
    if (eventArgs.Exception == null)
                {
                    transactionScope.Complete();
                    transactionScope.Dispose();
                }
                
    else
                {
                    transactionScope.Dispose();
                }
            }
        }

    然后将属性标识在需要添加事务的方法上
     [TransactionScopeAttribte]
    public static void Trans(Account a1, Account a2,decimal money)
    {
    这样这个Trans方法就包括在事务中了。
    注意:这里需要开启数据库所在机器的Distributed Transaction Coordinator服务。

    代码下载

  • 相关阅读:
    react-native Image resizeMode
    常见的前端设计模式
    Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    Error: [mobx] Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended.
    react-native 扫一扫功能(二维码扫描)功能开发
    字符串截取 及 substr 和 substring 的区别
    POST请求的forHTTPHeaderField
    使用MDScratchImageView实现刮奖效果
    计算Pan手势到指定点的角度
    CAShapeLayer的使用[2]
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1398034.html
Copyright © 2011-2022 走看看