PostSharp在编译时织入切面,性能高但需付费且侵入构建流程;Castle DynamicProxy在运行时生成代理,免费灵活但仅支持虚方法或接口拦截。

AOP(面向切面编程)是一种编程范式,用于将横切关注点(如日志、事务、缓存、权限验证等)与核心业务逻辑分离。在C#中,虽然语言本身不直接支持AOP,但可以通过第三方库来实现。其中,PostSharp 和 Castle DynamicProxy 是两种主流方案,它们的实现方式和适用场景有所不同。
PostSharp 是一个商业 AOP 框架(也有免费社区版),它通过在编译阶段修改 IL(中间语言)代码的方式,将切面逻辑“织入”到目标方法中,因此性能较高,使用也较为直观。
实现步骤:
示例代码:
public class LogAttribute : OnMethodBoundaryAspect { public override void OnEntry(MethodExecutionArgs args) { Console.WriteLine($"进入方法: {args.Method.Name}"); } public override void OnExit(MethodExecutionArgs args) { Console.WriteLine($"退出方法: {args.Method.Name}"); } public override void OnException(MethodExecutionArgs args) { Console.WriteLine($"方法异常: {args.Method.Name}, 异常: {args.Exception}"); } } // 使用 [Log] public void DoWork() { Console.WriteLine("执行业务逻辑"); throw new InvalidOperationException(); }优点是语法简洁,无需改变调用方式;缺点是需要编译时处理,对构建流程有侵入性,且高级功能需付费。
Castle DynamicProxy 是一个开源库,属于 Castle Project 的一部分。它通过在运行时生成代理类来拦截方法调用,从而实现 AOP。它不修改原始代码,而是基于接口或虚方法创建动态代理。
实现步骤:
示例代码:
public class LoggingInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine("调用前: " + invocation.Method.Name); try { invocation.Proceed(); // 执行原方法 } catch (Exception) { Console.WriteLine("调用中发生异常: " + invocation.Method.Name); throw; } finally { Console.WriteLine("调用后: " + invocation.Method.Name); } } } // 使用 var generator = new ProxyGenerator(); var service = generator.CreateClassProxy注意:若代理类,目标类的方法必须是 virtual;若代理接口,则无需 virtual,更推荐面向接口编程。
优点是免费、灵活、无编译期依赖;缺点是仅能拦截虚方法或接口方法,且代理对象的创建需手动管理。
PostSharp 更适合需要深度集成、高性能、且愿意接受商业许可的项目。它支持字段拦截、属性拦截等更复杂的场景。
Castle DynamicProxy 更适合轻量级、开源、依赖注入场景下的 AOP,尤其与 ASP.NET Core 或 Autofac 等容器结合使用非常自然。
基本上就这些。两种方式都能有效实现 AOP,关键是根据项目需求选择合适的技术路线。不复杂但容易忽略的是代理机制的限制和性能影响。
以上就是C#中的AOP(面向切面编程)如何实现?PostSharp与Castle DynamicProxy入门的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号