• .Net下面的AOP[转]


    .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一个比较好的开源库!  
    http://www.cnblogs.com/lovko/archive/2009/03/22/1418963.html

  • 相关阅读:
    [转]TOP 1比不加TOP慢的疑惑
    .ETL构建数据仓库五步法
    MySQL与Oracle的语法区别
    MySQL的表分区
    ORACLE分区表的使用和管理
    Oracle与MySQL的几点区别
    数据仓库超级大表分区方式改变
    Windows平台下MySQL常用操作与命令
    PowerDesigner使用教程 —— 概念数据模型
    MYSQL千万级数据量的优化方法积累
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1783355.html
Copyright © 2020-2023  润新知