AOP入门

 

一 AOP

Aspect-Oriented Programming(面向方面编程,AOP),如果我们基于面向对象的思想开发软件,一切皆是对象,而对于对象内部则无能为力。AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓 “方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

 

二 AOP framework

http://sourceforge.net/projects/aopnet/

http://www.postsharp.org/

http://www.aspectc.org/ 

 

三 基于postsharp的实例

1)参考:http://www.sharpcrafters.com/postsharp/documentation/getting-started 

2)QuickTraceAttribute.cs

using  System;
using  System.Collections.Generic;
using  System.Text;
using  PostSharp.Aspects;

namespace  Trace
{
    [Serializable]
    
public   sealed   class  QuickTraceAttribute : OnMethodBoundaryAspect
    {
        
private   string  enteringMessage, leavingMessage;

        
public   override   void  CompileTimeInitialize(System.Reflection.MethodBase method, AspectInfo aspectInfo)
        {
            
string  methodName  =  method.DeclaringType.FullName  +   " . "   +  method.Name;
            
this .enteringMessage  =   " Entering  "   +  methodName;
            
this .leavingMessage  =   " Leaving  "   +  methodName;
        }

        
public   override   void  OnEntry(MethodExecutionArgs args)
        {
            System.Diagnostics.Trace.WriteLine( 
this .enteringMessage);
            System.Diagnostics.Trace.Indent();
        }

        
public   override   void  OnExit(MethodExecutionArgs args)
        {
            System.Diagnostics.Trace.Unindent();
            System.Diagnostics.Trace.WriteLine( 
this .leavingMessage );
        }

        
public   override   void  OnException(MethodExecutionArgs args)
        {
            System.Diagnostics.Trace.Unindent();
            System.Diagnostics.Trace.WriteLine(
this .leavingMessage  +   "  with exception:  "   +
                args.Exception.Message 
+  Environment.NewLine  +  args.Exception.ToString());
        }
    }
}

3)Program.cs

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Threading;

//  apply quick trace attribute to all methods from 'mscorlib' and 'system.threading.*'
[assembly: Trace.QuickTrace(AttributeTargetAssemblies  =   " mscorlib " , AttributeTargetTypes  =   " System.Threading.* " )]

namespace  Trace
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            System.Diagnostics.Trace.Listeners.Add( 
new  System.Diagnostics.TextWriterTraceListener( Console.Out ) );

            Method1();
        }

        [QuickTrace]
        
static   void  Method1()
        {
            Method2();
        }

        [QuickTrace]
        
static   void  Method2()
        {
            Method3();
        }

        [QuickTrace]
        
static   void  Method3()
        {
            Thread.Sleep( 
10  );
        }
    }
}

4)结果

  

 

完!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值