网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C#应用
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.C#一个象棋游戏程序.
.使用foreach来读取记录.
.用Visual C#来增加数据记录(2).
.利用c#制作简单的留言板(3) .
.C#中Delegate浅析与思考.
.C# GridView 排序及分页.
.用C#开发.NET CF 蓝牙通信模块.
.C#实现Socket传输简单数据.
.C#代码操作IIS之虚拟目录.
.C# 中启动进程的三种方法.
.在C#中使用COM+实现事务控制.
.利用c#制作简单的留言板(4).
.C#利用正则表达式实现字符串搜索.
.对C#委托及事件委托的理解.
.C#正统的MYSQL的SQL文本替换规则.
.用C#开发智能手机软件:推箱子(五.
.利用c#制作简单的留言板(1) .
.网页表单自动填写技术(gmail为例) .
.C#中调用Windows API的要点.
.教你如何快速捕获.NET代码中隐藏.

基于Remoting透明代理的AOP组件

发表日期:2006-6-16


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

上一篇:用CDO.Message打造邮件发送程序 人气:9189
下一篇:C#中计算两个时间的差 人气:13029
浏览全部Remoting的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐