WEB开发网
开发学院WEB开发ASP.NET .NET可逆框架设计 阅读

.NET可逆框架设计

 2012-06-25 07:26:47 来源:WEB开发网   
核心提示:2.2可逆框架的入口实现我们需要简单的调用就能方便的使用可逆功能,不能以一种新的方式使用,.NET可逆框架设计(3),所以这里借鉴了Transaction Scope的设计思想,请看代码: /*** * author:深度训练 * blog:http://wangqingpei557.bl

2.2可逆框架的入口实现

我们需要简单的调用就能方便的使用可逆功能,不能以一种新的方式使用。所以这里借鉴了Transaction Scope的设计思想。
请看代码:

  1. /***  
  2.  * author:深度训练  
  3.  * blog:http://wangqingpei557.blog.51cto.com/  
  4.  * **/ 
  5. using System;  
  6. using System.Collections.Generic;  
  7. using System.Text;  
  8. using System.Transactions;  
  9.  
  10. namespace ReversibleLib  
  11. {  
  12.   /// <summary>  
  13.   /// 使代码成为可逆框架的事务性代码  
  14.   /// </summary>  
  15.   public class ReversibleManagerScope : IDisposable  
  16.   {  
  17.     /// <summary>  
  18.     /// 初始化ReversibleManagerScope新的实例  
  19.     /// </summary>  
  20.     public ReversibleManagerScope()  
  21.     {  
  22.       ReversibleManager._reversibleManager = new ReversibleManager();  
  23.     }  
  24.     /// <summary>  
  25.     /// 使用ReversibleManager对象构造ReversibleManagerScope使用范围对象  
  26.     /// </summary>  
  27.     /// <param name="manager">ReversibleManager实例</param>  
  28.     public ReversibleManagerScope(ReversibleManager manager)  
  29.     {  
  30.       ReversibleManager._reversibleManager = manager;  
  31.     }  
  32.     /// <summary>  
  33.     /// 使用自定义资源管理器构造ReversibleManagerScope包装的环境ReversibleManager.Current中的对象实例。  
  34.     /// </summary>  
  35.     /// <param name="source">IEnlistmentNotification资源管理器</param>  
  36.     public ReversibleManagerScope(IEnlistmentNotification source)  
  37.     {  
  38.       ReversibleManager._reversibleManager = new ReversibleManager(source);  
  39.     }  
  40.     /// <summary>  
  41.     /// 全局上下文ReversibleManager对象销毁  
  42.     /// </summary>  
  43.     public void Dispose()  
  44.     {  
  45.       ReversibleManager._reversibleManager = null;  
  46.     }  
  47.     /// <summary>  
  48.     /// 完成整个操作的提交。该操作将提交事务栈中的所有依赖事务  
  49.     /// </summary>  
  50.     public void Completed()  
  51.     {  
  52.       ReversibleManager.Current.Commit();  
  53.     }  
  54.   }  
  55.   /// <summary>  
  56.   /// 可逆模块的入口。  
  57.   /// ReversibleManager对事务对象的封装,实现阶段性的事务提交和回滚。  
  58.   /// </summary>  
  59.   public class ReversibleManager  
  60.   {  
  61.     #region 上下文静态ReversibleManager实例  
  62.     /// <summary>  
  63.     /// 持有对可逆框架的对象引用  
  64.     /// </summary>  
  65.     internal static ReversibleManager _reversibleManager;  
  66.     /// <summary>  
  67.     /// 获取当前上下文中可逆框架  
  68.     /// </summary>  
  69.     public static ReversibleManager Current  
  70.     {  
  71.       get { return _reversibleManager; }  
  72.     }  
  73.     #endregion  
  74.  
  75.     #region 构造对象  
  76.     /// <summary>  
  77.     /// 默认构造函数  
  78.     /// </summary>  
  79.     public ReversibleManager() { }  
  80.     /// <summary>  
  81.     /// 表示可提交的事务(主事务)  
  82.     /// </summary>  
  83.     private CommittableTransaction _commiTransaction;  
  84.     /// <summary>  
  85.     /// 支持两阶段提交协议的资源管理器(主资源管理器)  
  86.     /// </summary>  
  87.     private IEnlistmentNotification _resourceManager;  
  88.     /// <summary>  
  89.     /// 重载构造函数,使用自定义资源管理器构造可逆模块的开始。  
  90.     /// </summary>  
  91.     /// <param name="resource">IEnlistmentNotification接口对象</param>  
  92.     public ReversibleManager(IEnlistmentNotification resource)  
  93.     {  
  94.       _resourceManager = resource;  
  95.       InitLoad(IsolationLevel.Serializable);  
  96.     }  
  97.     /// <summary>  
  98.     /// 重载构造函数,使用自定义资源管理器、内部事务范围的事务隔离级别构造可逆模型的开始。  
  99.     /// </summary>  
  100.     /// <param name="resource">IEnlistmentNotification接口对象</param>  
  101.     /// <param name="isolationlevel">IsolationLevel枚举成员</param>  
  102.     public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel)  
  103.     {  
  104.       _resourceManager = resource;  
  105.       InitLoad(isolationlevel);  
  106.     }  
  107.     /// <summary>  
  108.     /// 事务初始化阶段的参数对象  
  109.     /// </summary>  
  110.     TransactionOptions _options;  
  111.     /// <summary>  
  112.     /// 重载构造函数,使用自定义资源管理器、内部事务范围的事务隔离级别、事务超时时间范围构造可逆模块的开始。  
  113.     /// </summary>  
  114.     /// <param name="resource">IEnlistmentNotification接口对象</param>  
  115.     /// <param name="isolationlevel">IsolationLevel枚举成员</param>  
  116.     /// <param name="span">TimeSpan时间范围</param>  
  117.     public ReversibleManager(IEnlistmentNotification resource, IsolationLevel isolationlevel, TimeSpan span)  
  118.     {  
  119.       _options = new TransactionOptions();  
  120.       _options.Timeout = span;  
  121.       InitLoad(isolationlevel);  
  122.     }  
  123.     /// <summary>  
  124.     /// 构造CommittableTransaction对象实例。  
  125.     /// </summary>  
  126.     /// <param name="level">事务隔离级别</param>  
  127.     private void InitLoad(IsolationLevel level)  
  128.     {  
  129.       if (_options == null)  
  130.         _options = new TransactionOptions();  
  131.       _options.IsolationLevel = level;  
  132.       _commiTransaction = new CommittableTransaction(_options);  
  133.       _commiTransaction.EnlistVolatile(_resourceManager, EnlistmentOptions.None);  
  134.       //作为事务栈的头开始整个可逆结构。  
  135.       _tranStack.Push(_commiTransaction);//压入事务栈  
  136.       _resourceStack.Push(_resourceManager);//压入资源栈  
  137.       //设置环境事务,让所有支持事务性感知框架的代码都能执行。  
  138.       Transaction.Current = _commiTransaction;  
  139.     }  
  140.     #endregion  
  141.  
  142.     /// <summary>  
  143.     /// 事务栈,依次存放事务。  
  144.     /// </summary>  
  145.     private System.Collections.Generic.Stack<Transaction> _tranStack = new Stack<Transaction>();  
  146.     /// <summary>  
  147.     /// 资源栈,依次存放事务使用的资源。  
  148.     /// </summary>  
  149.     private System.Collections.Generic.Stack<IEnlistmentNotification> _resourceStack = new Stack<IEnlistmentNotification>();  
  150.     /// <summary>  
  151.     /// 阶段性事件委托  
  152.     /// </summary>  
  153.     /// <param name="tran">Transaction环境事务</param>  
  154.     public delegate void PhaseHanlder(System.Transactions.Transaction tran);  
  155.     /// <summary>  
  156.     /// 下一步事件  
  157.     /// </summary>  
  158.     public event PhaseHanlder NextEvent;  
  159.     /// <summary>  
  160.     /// 上一步事件  
  161.     /// </summary>  
  162.     public event PhaseHanlder PreviousEvent;  
  163.     /// <summary>  
  164.     /// 开始下一步操作  
  165.     /// </summary>  
  166.     /// <typeparam name="S">IEnlistmentNotification接口实现</typeparam>  
  167.     /// <param name="level">IsolationLevel事务的隔离级别(对全局事务处理设置)</param>  
  168.     /// <param name="source">下一步操作的自定义数据管理器</param>  
  169.     public void Next<S>(IsolationLevel level, S source)  
  170.       where S : class,IEnlistmentNotification, new()  
  171.     {  
  172.       Transaction tran = _tranStack.Peek();//获取事务栈的顶端事务  
  173.       if (tran == null)  
  174.         tran = Transaction.Current;//主事务  
  175.       DependentTransaction depentran = tran.DependentClone(DependentCloneOption.BlockCommitUntilComplete);  
  176.       //将本次事务处理的资源管理器压入资源栈中  
  177.       depentran.EnlistVolatile(source, EnlistmentOptions.None);  
  178.       _tranStack.Push(depentran);  
  179.       _resourceStack.Push(source);  
  180.       //切换环境事务场景  
  181.       Transaction.Current = depentran;  
  182.       if (NextEvent != null)  
  183.         if (NextEvent.GetInvocationList().Length > 0)  
  184.           NextEvent(Transaction.Current);  
  185.     }  
  186.     /// <summary>  
  187.     /// 返回上一步操作  
  188.     /// </summary>  
  189.     /// <typeparam name="T">需要接受的数据对象类型</typeparam>  
  190.     /// <param name="refadd">需要接受的数据对象引用</param>  
  191.     public void Previous<T>(out T refadd) where T : class,new()  
  192.     {  
  193.       Transaction tran = _tranStack.Pop();  
  194.       if (tran == null)//顶层事务  
  195.         Transaction.Current.Rollback();  
  196.       // tran.Rollback();//回滚本事务,将触发所有克隆事务的回滚。  
  197.       if (PreviousEvent != null)  
  198.         if (PreviousEvent.GetInvocationList().Length > 0)  
  199.         {  
  200.           //设置上一步数据对象  
  201.           refadd = (_resourceStack.Pop() as IReversibleGetResourceData<T>).GetPreviousData();  
  202.           PreviousEvent(Transaction.Current);  
  203.           return;  
  204.         }  
  205.       refadd = new T();//事务处理异常  
  206.     }  
  207.     /// <summary>  
  208.     /// 提交事物堆栈中的所有事物  
  209.     /// </summary>  
  210.     public void Commit()  
  211.     {  
  212.       if (Transaction.Current is DependentTransaction)  
  213.         (Transaction.Current as DependentTransaction).Complete();  
  214.       for (int i = 0; i < _tranStack.Count - 1; i++)  
  215.       {  
  216.         //依赖事务  
  217.         (_tranStack.Pop() as DependentTransaction).Complete();  
  218.       }  
  219.       //提交事务,主事务。必须进行克隆主体的提交才能完成所有阶段的操作。  
  220.       (_tranStack.Pop() as CommittableTransaction).Commit();  
  221.     }  
  222.     /// <summary>  
  223.     /// 回滚事物堆栈中的所有事物  
  224.     /// </summary>  
  225.     public void RollBack()  
  226.     {  
  227.       if (Transaction.Current is DependentTransaction)  
  228.         (Transaction.Current as DependentTransaction).Rollback();  
  229.       for (int i = 0; i < _tranStack.Count - 1; i++)  
  230.       {  
  231.         //依赖事务  
  232.         (_tranStack.Pop() as DependentTransaction).Rollback();  
  233.       }  
  234.       //提交事务,主事务。必须进行克隆主体的提交才能完成所有阶段的操作。  
  235.       (_tranStack.Pop() as CommittableTransaction).Rollback();  
  236.     }  
  237.   }  
  238. }  

上一页  1 2 3 4  下一页

Tags:NET 可逆 框架

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接