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)结果

  

完!


作者:iTech
微信公众号: cicdops
出处:http://itech.cnblogs.com/
github:https://github.com/cicdops/cicdops

原文地址:https://www.cnblogs.com/itech/p/1763793.html