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

    代码下载

  • 相关阅读:
    eclipse中SVN分支合并到主干
    Nginx+Php-fpm+MySQL+Redis源代码编译安装指南
    php-fpm的重启/关闭
    修改PHP上传文件大小限制的方法
    【转】Android AlertDialog自定义布局
    unity 多线程
    今天无意中发现的WWW.threadPriority
    Socket.IO for Unity 简要介绍
    shader一般都是用工具调试的
    METAL渲染是什么?
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1398034.html
Copyright © 2011-2022 走看看