欢迎光临
我们一直在努力

基于remoting透明代理的aop组件_c#应用

建站超值云服务器,限时71元/月

   说到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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 基于remoting透明代理的aop组件_c#应用
分享到: 更多 (0)