aop组件 python_基于Remoting透明代理的AOP组件

说到AOP在cnblogs上也有不少关于实现的文章,所以这次就不描述具体实现;有兴趣可以下载组件源码了解,当然组件只是一个初型并不会有什么强大的功能,也可能存在比较多的问题。

这几天由于项目移交给测试人员测试,因此空闲的时间比较多;为了不浪费这些时间所以想到用Remoting透明代理机制做一个简单的AOP组件,顺便也学习Remoting中透明代理的实现和运用。刚开始做还是挺痛头的,因为本机的MSDN并没有充足的帮助。于是就到cnblogs和Google搜了一下,找到一编不错的文章:。把资料整理和清楚一下思路就开始干活。实现过程大概花了一个工作日吧,主要实现了以下对象:

AopProxyAttribute派生于ProxyAttribute

AopRealProxyy派生于RealProxy

///

///拦载对象描述接口

///

public interface ICutiner

{

///

///执行方法的源对象

///

object Source

{

get;

}

///

///执行方法的参数集

///

object[] Args

{

get;

}

///

///方法执行前拦载过程

///

void Executing();

///

///方法执行后拦载过程

///

/// 返回值

/// 处理后的返回

object Executed(object returnvalue);

///

///实始化拦载对象

///

///

///

void initialize(object source,object[] args);

///

///执行方法错误信息

///

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值是否合法。可以通过以下方式实现横向检测对象:

publicclass ValTest:AopLibrary.CutinerAdapter

{

public override void Executing()

{

Product pr = (Product)Source;

if(pr.Name == null || pr.Name =="")

{

throw(new Exception("请输入合法的产品名称!"));

}

base.Executing ();

}

}

当制定检测对象后,就可以通过配置文件关联起来。

测试调用代码:

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方法异常并把错误信息保存起来。首先是编写错误处理的类:

publicclass 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);

}

}

有了处理对象后就通过配置关联起来.

配置完成后当运行ParseInt和ParseDT方法时发生错误就会把错误信息写到文件中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值