自由色彩,无限魅力:www.zyml.net

基于Remoting透明代理的AOP组件

上一篇 / 下一篇  2008-02-04 15:32:04

查看( 4 ) / 评论( 0 )
  
   说到AOP在cnblogs上也有不少关于实现的文章,所以这次就不描述具体实现;有兴趣可以下载组件源码了解,当然组件只是一个初型并不会有什么强大的功能,也可能存在比较多的问题。
这几天由于项目移交给测试人员测试,因此空闲的时间比较多;为了不浪费这些时间所以想到用Remoting透明代理机制做一个简单的AOP组件,顺便也学习Remoting中透明代理的实现和运用。刚开始做还是挺痛头的,因为本机的MSDN并没有充足的帮助。于是就到cnblogs和Google搜了一下,找到一编不错的文章:http://www.rsdn.ru/article/dotnet/cntxtvsrealproxy.xml。把资料整理和清楚一下思路就开始干活。实现过程大概花了一个工作日吧,主要实现了以下对象:
       AopProxyAttribute派生于ProxyAttribute
       AopRealProxyy派生于RealProxy
    /// <summary>
       /// 拦载对象描述接口
       /// </summary>
       public interface ICutiner
       {
              /// <summary>
              /// 执行方法的源对象
              /// </summary>
              object Source
              {
                     get;
                     
              }
              /// <summary>
              /// 执行方法的参数集
              /// </summary>
              object[] Args
              {
                     get;
                     
              }
              /// <summary>
              /// 方法执行前拦载过程
              /// </summary>
              void Executing();
              /// <summary>
              /// 方法执行后拦载过程
              /// </summary>
              /// <param name="returnvalue">返回值</param>
              /// <returns>处理后的返回</returns>
              object Executed(object returnvalue);
              /// <summary>
              /// 实始化拦载对象
              /// </summary>
              /// <param name="source"></param>
              /// <param name="args"></param>
              void initialize(object source,object[] args);
              /// <summary>
              /// 执行方法错误信息
              /// </summary>
              Exception Error
              {
                     get;
                     set;
              }
       }

制定规则后剩下的工作就整合了,如何把功能整合起来就不说了,对开发人员来说源码是最好的文档。
下面让我们来看下组件在实际使用中的效果。
值验证
       [AopLibrary.AopProxy]
    public class Product:ContextBoundObject
    {
        public Product()
        {
            //
            //
        }
        private string mName;
        public string Name
        {
            get
            {
                return mName;
            }
            set
            {
                mName = value;
            }
        }
        public void Save()
        {
        }
    }
    如何通过AOP的方式在调用Product对象的Save方法前进行检查Name值是否合法。可以通过以下方式实现横向检测对象:
   public class ValTest:AopLibrary.CutinerAdapter
    {
        public override void Executing()
        {
            Product pr = (Product)Source;
            if(pr.Name == null || pr.Name =="")
            {
                throw(new Exception("请输入合法的产品名称!"));
            }
            base.Executing ();
        }
}
       当制定检测对象后,就可以通过配置文件关联起来。
       <accepter type="AopTest.validate.Product,AopTest">
        <cutiner method="Save" type="AopTest.validate.ValTest,AopTest" />
    </accepter>
       测试调用代码:
         try
            {

                validate.Product product = new AopTest.validate.Product();
                product.Name ="cat";
                product.Save();
                Console.WriteLine("Save:OK");
                product = new AopTest.validate.Product();
                product.Save();
               
            }
            catch(Exception e_)
            {
                Console.WriteLine("Exception:"+e_.Message);
            }
统一错误处理
   AopLibrary.AopProxy]
    public class DataParse:ContextBoundObject
    {
        public DataParse()
        {
            
        }
        public int ParseInt(string value)
        {
            return int.Parse(value);
        }
        public DateTime ParseDT(string value)
        {
            return DateTime.Parse(value);
        }
    }
   通过AOP的方式统一捕获ParseInt和ParseDT方法异常并把错误信息保存起来。首先是编写错误处理的类:
   public class SaveException:AopLibrary.CutinerAdapter
    {
        public override object Executed(object returnvalue)
        {
            if(Error != null)
            {
                System.IO.StreamWriter writer = new System.IO.StreamWriter("c:\\errorlog.txt",true,System.Text.Encoding.Default);
                writer.WriteLine(Error.Message);
                writer.Close();
            }
            return base.Executed (returnvalue);
        }
}
       有了处理对象后就通过配置关联起来.
   <accepter type="AopTest.exception.DataParse,AopTest">
            <cutiner method="ParseDT,ParseInt" type="AopTest.exception.SaveException,AopTest" />
    </accepter>
       配置完成后当运行ParseInt和ParseDT方法时发生错误就会把错误信息写到文件中。
下载相关例子和组件源码
http://henryfan.cnblogs.com/archive/2006/06/15/426344.html

TAG:

我来说两句

(可选)

日历

« 2009-01-08  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 104830
  • 日志数: 662
  • 图片数: 22
  • 影音数: 169
  • 商品数: 44
  • 文件数: 344
  • 书签数: 20
  • 建立时间: 2007-04-27
  • 更新时间: 2008-10-09

RSS订阅

Open Toolbar