随着业务越来越复杂,最近决定把一些频繁查询但是数据不会怎么变更的接口做一下缓存,这种功能一般用 AOP 就能实现了,找了一下客户端又没现成的直接可以用,嗐,就只能自己开发了。
代理模式和AOP
理解代理模式后,对 AOP 自然就手到擒来,所以先来点前置知识。
代理模式是一种使用一个类来控制另一个类方法调用的范例代码。
代理模式有三个角色:
- ISubject 接口,职责是定义行为。
- ISubject 的实现类 RealSubject,职责是实现行为。
- ISubject 的代理类 ProxySubject,职责是控制对 RealSubject 的访问。
代理模式有三种实现:
- 普通代理。
- 强制代理,强制的意思就是不能直接访问 RealSubject 的方法,必须通过代理类访问。
- 动态代理,动态的意思是通过反射生成代理类,AOP 一般就是基于动态代理。
AOP 有四个关键知识点:
客户端使用了 Prism 的 IOC 来实现控制反转,Prism 支持多种 IOC,我这里使用 DryIoc,因为其他几个 IOC 已经不更新了。
客户端内存缓存使用 Microsoft.Extensions.Caching.Memory,这个算是最常用的了。
- 切入点 JoinPoint。就是 RealSubject 中的被控制访问的方法。
- 通知 Advice,就是代理类中的方法,可以控制或者增强 RealSubject 的方法,有前置通知、后置通知、环绕通知等等
- 织入 Weave,就是按顺序调用通知和 RealSubject 方法的过程。
- 切面 Aspect,多个切入点就会形成一个切面。
-
public interface ISubject { void DoSomething(string value); Task DoSomethingAsync(string value); } public class RealSubject : ISubject { public void DoSomething(string value) { Debug.WriteLine(value); } public async Task DoSomethingAsync(string value) { await Task.Delay(2000); Debug.WriteLine(value); } } public class Proxy : ISubject { private readonly ISubject _realSubject; public Proxy() { _realSubject = new RealSubject(); } /// <summary> /// 这就是切入点 /// </summary> /// <param name="value"></param> public void DoSomething(string value) { // 这个过程就是织入 Before(); _realSubject.DoSomething(value); After(); } public Task DoSomethingAsync(string value) { throw new NotImp