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

    代码下载

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/nuaalfm/p/1398034.html
Copyright © 2011-2022 走看看