首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • 基于Remoting透明代理的AOP组件
      2007-2-25  来源:网络资源  编辑:Jsbulo  热度:

    说到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方法时发生错误就会把错误信息写到文件中。