AOP入门
一 AOP
Aspect-Oriented Programming(面向方面编程,AOP),如果我们基于面向对象的思想开发软件,一切皆是对象,而对于对象内部则无能为力。AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓 “方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
二 AOP framework
http://sourceforge.net/projects/aopnet/
三 基于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());
}
}
}
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 );
}
}
}
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)结果
完!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理