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服务。

    代码下载

  • 相关阅读:
    利用角色简化playbook
    lamp
    playbook部署lamp
    ansible-playbook配置不同系统yum源
    66. 加一
    628. 三个数的最大乘积
    977. 有序数组的平方
    383. 赎金信
    203. 移除链表元素
    83. 删除排序链表中的重复元素
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1398034.html
Copyright © 2011-2022 走看看