当前位置: 首页 > ai >正文

C# AOP编程

        AOP(面向切片编程的概念我这里就不介绍了,这里先介绍一下C#中的AOP编程框架。

1.AOP的分类

        .net下支持AOP的框架很多,搜了一下有:PostSharp、AspectInjector、FodyCastle Windsor、Spring.NET、Ninject、Unity等,实现的方式主要氛围两大类:

  • 编译时织入:通常在运行时性能较好,但编译时间可能增加。上面的红色框架
  • 动态代理:通常在高频调用时会有额外的性能开销。上面的蓝色框架。

1.编译时织入举例

        PostSharp是非开源的,这里以AspectInjector为例:

using AspectInjector.Broker;Console.WriteLine("Hello, World!");
MyClass myClass = new MyClass();
myClass.MyMethod();[Aspect(Scope.Global)]
[Injection(typeof(LogAttribute))]
public class LogAttribute : Attribute
{[Advice(Kind.Before)]public void Before([Argument(Source.Name)]string name){Console.WriteLine($"Entering method: {name}");}[Advice(Kind.After)]public void After([Argument(Source.Name)] string name){Console.WriteLine($"Exiting method: {name}");}
}public class MyClass
{[Log]public void MyMethod(){Console.WriteLine("Executing MyMethod");}
}

运行结果如下:

Hello, World!
Entering method: MyMethod
Executing MyMethod
Exiting method: MyMethod

想了解更多可以参考AspectInjector的官方文档

2.动态代理举例

        单纯的动态代理其实需要手动编写的代码较多,一般是结合依赖注入容器来使用。这个以比较常用的Autofac 依赖注入容器为例:

  • 首先,通过 NuGet 安装 Autofac 和动态代理支持:
Install-Package Autofac
Install-Package Autofac.Extras.DynamicProxy
  •  创建接口和实现类

定义一个接口和它的实现类:

public interface IMessageService
{void SendMessage(string message);
}public class EmailService : IMessageService
{public void SendMessage(string message){Console.WriteLine($"Email sent: {message}");}
}
  • 3. 创建拦截器

定义一个拦截器类,用于实现 AOP 功能:

using Castle.DynamicProxy;
using System;public class LoggingInterceptor : IInterceptor
{public void Intercept(IInvocation invocation){Console.WriteLine($"Entering method: {invocation.Method.Name}");invocation.Proceed(); // 调用原方法Console.WriteLine($"Exiting method: {invocation.Method.Name}");}
}
  • 设置 Autofac 容器

在 Autofac 容器中注册服务和拦截器:

using Autofac;public class Program
{static void Main(string[] args){var builder = new ContainerBuilder();builder.RegisterType<EmailService>().As<IMessageService>().EnableInterfaceInterceptors().InterceptedBy(typeof(LoggingInterceptor));builder.RegisterType<LoggingInterceptor>();var container = builder.Build();var messageService = container.Resolve<IMessageService>();messageService.SendMessage("Hello, Autofac with AOP!");}
}

运行结果:

Entering method: SendMessage
Email sent: Hello, Autofac with AOP!
Exiting method: SendMessage

可以看到我们成功的实现了在原函数前后插入执行代码。动态代理在web服务使用较多。

http://www.xdnf.cn/news/7850.html

相关文章:

  • 【亲测有效】Ubuntu22.04安装黑屏重启进入系统卡死
  • 如果有三个服务实例部署在三台不同的服务器上,这三个服务实例的本地缓存,是存储一模一样的数据?还是各自只存一部分?
  • 《易经》的数学表达:初级版和高级版
  • 回溯算法——排列篇
  • 新导游入行规范与职业发展指导
  • auto关键字解析
  • 时源芯微|π型LC滤波电路
  • 力扣面试150题--填充每个节点的下一个右侧节点指针 II
  • SPI协议软件实现 W25QXX flash 存储器
  • 【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
  • C++函数重载
  • 2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展
  • 线端子人工做线操作介绍
  • C++学习:六个月从基础到就业——多线程编程:条件变量
  • 诊断仪进行CAN采样点测试的原理
  • 管理会议最佳实践:高效协同与价值最大化
  • ctfhub技能书http协议
  • 2570. 合并两个二维数组 - 求和法
  • RTMP协议解析【三】
  • 【论文复现】——基于NDT与ICP结合的点云配准算法(matlab版)
  • 网页 HTML布局(详解)
  • 精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践
  • 新能源汽车充电桩资源如何利用资源高效配置?
  • Linux 内核音视频架构(V4L2 )介绍
  • 算法中的数学:欧拉函数
  • 工作流引擎-03-聊一聊什么是流程引擎(Process Engine)?
  • 用户缓冲区
  • JavaScript 函数、方法、限定符
  • 关于Vue自定义组件封装的属性/事件/插槽的透传问题
  • 密码合集(不定期更新)