架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.Net下面的AOP[转]

Posted on 2009-03-22 14:43  chen eric  阅读(1918)  评论(1编辑  收藏  举报

 

.Net下面的AOP2006-10-21 15:14在这几年,Java领域两个比较大的热点,就是AOP和微容器。微容器以Spring为代表,提供了类似于J2EE里面的应用服务器的功能,但是又比较轻便,容易修改类的定义,有利用于一些企业应用中复杂的业务逻辑的实现。同时微容易也半强迫性的让程序员,以OOP的思维方式来对于程序进行编程,因此Spring也大红大紫,成为这两年Java领域的一个应用热点,形成了著名的Spring+Hibernate(ORM)+Structs(Web框架)组合。另外一个热点就是AOP。AOP可以在不改变原有代码的情况下,实现程序的一些附加功能。如下面的代码: 

public CustomerImpl:ICustomer{ 

public void updateCustomer(customer e) 



if(logUtil.isLogined()){ 

//实际的代码 





public void insertCustomer(customer c) 



if(logUtil.isLogined()){ 

//执行插入的代码 







如果用AOP,则可以: 

public class CustomIntecept:Intecept 



public void InterCept(IInvocation inv,object[] args) 



public override object Intercept(IInvocation inv,object[] args) 



if(inv.Method.Name.Equals("updateCustomer"|| inv.Method.Name.Equlas("insertCustomer")) 



if(!logUtil.isLoggined()) 







else 

return base.Intercept(inv,args) 











这样insertCustomer和updateCustomer就只需要完成自己的功能就可以了,而且拦截还可以增加其他的功能,无论是在函数调用以前还是调用以后。 

在.Net下面,我对于AOP并不是非常的清楚,今天看到了用Castle项目的DynamticProxy来实现.Net下面AOP的一篇Demo,感觉比较简单,非常使用。 

一个比较简单的类: 

public interface IMyCalc 



int add(int a,int b); 

int sub(int a,int b); 





public class MyCalc:IMyCalc 



public MyCalc() 







public int add(int a,int b) 



return a+b; 





public int sub(int a,int b) 



return a>b?a-b:b-a; 





} 

Castle的DynamticProxy需要一个ProxyGenerator。 

public virtual object CreateProxy(Type[],IInterceptor,object); 

主要是IInterceptor接口,Castle提供一个基本的IInterceptor-StandardInterceptor,这个类提供一个函数: 

public virtual object Intercept( 

IInvocation invocation, 

params object[] args 

); 

只有重载这个函数就可以实现自己的拦截。如上面的MyCalc,如果想拦截add函数,可以: 

public class MyInteperator:Castle.DynamicProxy.StandardInterceptor 



public override object Intercept(IInvocation inv,object[] args) 



if(inv.Method.Name.Equals("add")) 



Console.WriteLine(
"Before Invoke [add]"); //开始执行前打印"Before Invoke[add]

object item=base.Intercept(inv,args); 

Console.WriteLine(
"After Invoke[add]"); //执行完毕后打印“After Invoke[add].." 

return item; 



else 

return base.Intercept(inv,args); 





最后测试一下: 

static void Main(string[] args) 



ProxyGenerator generator
=new ProxyGenerator(); 

//下面是 

IMyCalc myCalc
=(IMyCalc)generator.CreateProxy( 

typeof(IMyCalc),new MyInteperator(),new MyCalc()); 

int c=myCalc.add(9,100); 

Console.WriteLine(
"MyCalc add(9,100)={0}",c); 



执行结果: 

Before Invoke[add] 

After Invoke[add] 

MyCalc add(
9,100)=109 



Castle还集成了NHibernate(.Net下面的ORM框架)以及NVolicity(一个页面模板框架),提供了.Net下面不同于Aspx的Web页面方式。Castle提供了一个类似于Rails的monoRails(一种Web整体框架)、和一个微容器,是.Net一个比较好的开源库!