.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一个比较好的开源库!
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一个比较好的开源库!