在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是软件开发中的一个热点,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性。

比如说三层的调用:UI => BLL => DAL,正常来说我们会在UI层调用BLL层某个类的某个方法,然后BLL层某个类的某个方法又会调用DAL层某个类的某个方法,可以说通常情况下我们都是这么干的;如果说UI调BLL、BLL调DAL是纵向的话,那么AOP就是横向的,AOP可以做到在调用BLL层或DAL层任意方法之前之后做一些统一的逻辑处理。

AOP的典型应用场景:日志记录、权限验证、异常处理、缓存等

目前,可以实现AOP的类库也有很多,如下:

AspectCore
Unity
Castle DynamicProxy
Dora.Interception

但是在.net core中有DispatchProxy类(命名空间:System.Reflection),提供实例化代理对象和处理其方法调度的机制,借助它我们可以自己实现AOP,直接看示例

定义一个消息接口IMessage,其中有一个发送消息Send和接收消息Receive的方法定义:

    public interface IMessage
{
void Send(string content);
void Receive(string content);
}

定义电子邮件类EmailMessage实现消息接口IMessage,实现使用电子邮件发送和接收消息:

    public class EmailMessage : IMessage
{
public void Send(string content)
{
Console.WriteLine("Send Email:" + content);
}
public void Receive(string content)
{
Console.WriteLine("Receive Email:" + content);
}
}

定义日志拦截器LogDispatchProxy 继承自DispatchProxy类,重写基类Invoke方法并在目标方法调用前后加上所需业务逻辑;然后定义TargetClass属性,该属性是目标方法所属类的实例

    public class LogDispatchProxy : DispatchProxy
{
public object TargetClass { get; set; }
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
Write("方法执行前");
var result = targetMethod.Invoke(TargetClass, args);
Write("方法执行后");
return result;
} private void Write(string content)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(content);
Console.ResetColor();
}
}

使用:

    class Program
{
static void Main(string[] args)
{
//使用DispatchProxy类的静态方法Create生成代理类,其中Create是个泛型方法,泛型有两个值,第一个值必须是接口,第二个值必须是DispatchProxy的子类
IMessage messageDispatchProxy = DispatchProxy.Create<IMessage, LogDispatchProxy>();
//创建一个实现了IMessage接口的类的实例,并赋值给代理类的TargetClass属性
((LogDispatchProxy)messageDispatchProxy).TargetClass = new EmailMessage();
messageDispatchProxy.Send("早上好");
Console.WriteLine("=======================================");
messageDispatchProxy.Receive("中午好"); Console.ReadKey();
}
}

执行结果

我的理解:通过DispatchProxy.Create创建的代理类messageDispatchProxy 就是一个LogDispatchProxy类,并且利用我们提供的的实例实现了IMessage接口,所以messageDispatchProxy可以强转为LogDispatchProxy或IMessage

至此,我们没有通过任何第三方类库,自己实现了一个AOP

最新文章

  1. poj3311 Hie with the Pie (状态压缩dp,旅行商)
  2. android MediaPlayer API大全已经方法详解(转载)
  3. wndows程序设计之书籍知识与代码摘录-获取视屏显示器像素等参数GetsystemMetrics
  4. c# 调用打印机
  5. BZOJ1736 [Usaco2005 jan]The Wedding Juicer 婚宴的榨汁机
  6. js判断浏览器类型 js判断ie6不执行
  7. 基于PCA的人脸识别步骤
  8. solr6.6初探之配置篇
  9. python3 lcs 最大公共子序列
  10. python自动化测试之异常及日志
  11. 机器人学 —— 机器人感知(Location)
  12. ORM跨表查询问题
  13. sitecore系统教程之媒体库
  14. ASP.NET —— Web Pages
  15. HTML5 图片宽高自适应,居中裁剪不失真
  16. 170512、java日志文件log4j.properties配置详解
  17. HDU1796How many integers can you find(容斥原理)
  18. Linq lambda 匿名方法
  19. 微信小程序-组件篇
  20. 洛谷 P1338 末日的传说 解题报告

热门文章

  1. COGS 2510. 拯救紫萱学姐
  2. VMware15.5版本下安装CentOS_7_64bit
  3. 代码审计-phpcms9任意文件读取
  4. PHP array_reduce
  5. [NOIp2010] luogu P1541 乌龟棋
  6. .NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
  7. Ubuntu中用户名密码和root密码修改
  8. 关于Linux中的 localhost 默认地址简单介绍
  9. python爬取旅游数据+matplotlib简单可视化
  10. ES6基本语法入门