一、Aop

Aop 面向切面编程(Aspect Oriented Program),在项目中,很多地方都会用到Aop的概念,比如:过滤器(Filter),中间件(Middleware) 通常用来处理数据请求、切面缓存、记录日志、异常捕获等等。但是想在服务层中使用Aop,前面说的就不好使了,目的是减少代码入侵,降低解耦,又能实现业务需求,才是Aop意义所在。前面介绍使用了Autofac,在这还能发挥作用。

1、安装

安装Autofac.Extras.DynamicProxy,Autofac实现Aop用的是Castle.Core动态代理,Castle.Core可以单独使用,跟Autofac配合起来更方便。Autofac.Extras.DynamicProxy依赖Autofac,所以有的文章是直接就装了这个包,一个效果。

2、异步处理

Castle.Core本身是不支持异步的,所以参考封装异步Aop类 AsyncInterceptorBase 继承 IInterceptor。

public abstract class AsyncInterceptorBase : IInterceptor
{
public AsyncInterceptorBase()
{
} public void Intercept(IInvocation invocation)
{
BeforeProceed(invocation);
invocation.Proceed();
if (IsAsyncMethod(invocation.MethodInvocationTarget))
{
InterceptAsync((dynamic)invocation.ReturnValue, invocation);
}
else
{
AfterProceedSync(invocation);
}
} private bool CheckMethodReturnTypeIsTaskType(MethodInfo method)
{
var methodReturnType = method.ReturnType;
if (methodReturnType.IsGenericType)
{
if (methodReturnType.GetGenericTypeDefinition() == typeof(Task<>) ||
methodReturnType.GetGenericTypeDefinition() == typeof(ValueTask<>))
return true;
}
else
{
if (methodReturnType == typeof(Task) ||
methodReturnType == typeof(ValueTask))
return true;
}
return false;
} private bool IsAsyncMethod(MethodInfo method)
{
bool isDefAsync = Attribute.IsDefined(method, typeof(AsyncStateMachineAttribute), false);
bool isTaskType = CheckMethodReturnTypeIsTaskType(method);
bool isAsync = isDefAsync && isTaskType; return isAsync;
} private async Task InterceptAsync(Task task, IInvocation invocation)
{
await task.ConfigureAwait(false);
AfterProceedAsync(invocation, false);
} private async Task<TResult> InterceptAsync<TResult>(Task<TResult> task, IInvocation invocation)
{
TResult ProceedAsyncResult = await task.ConfigureAwait(false);
invocation.ReturnValue = ProceedAsyncResult;
AfterProceedAsync(invocation, true);
return ProceedAsyncResult;
} private async ValueTask InterceptAsync(ValueTask task, IInvocation invocation)
{
await task.ConfigureAwait(false);
AfterProceedAsync(invocation, false);
} private async ValueTask<TResult> InterceptAsync<TResult>(ValueTask<TResult> task, IInvocation invocation)
{
TResult ProceedAsyncResult = await task.ConfigureAwait(false);
invocation.ReturnValue = ProceedAsyncResult;
AfterProceedAsync(invocation, true);
return ProceedAsyncResult;
} protected virtual void BeforeProceed(IInvocation invocation) { }
protected virtual void AfterProceedSync(IInvocation invocation) { }
protected virtual void AfterProceedAsync(IInvocation invocation, bool hasAsynResult) { }
}

新建一个服务切面类 ServiceAop 继承 AsyncInterceptorBase

public class ServiceAop : AsyncInterceptorBase
{
private readonly ILogger<ServiceAop> _logger;
public ServiceAop(ILogger<ServiceAop> logger) {
_logger = logger;
}
protected override void BeforeProceed(IInvocation invocation)
{
_logger.LogInformation($"ServiceAop调用方法:{invocation.Method.Name},参数:{JsonConvert.SerializeObject(invocation.Arguments) }");
} protected override void AfterProceedSync(IInvocation invocation)
{
_logger.LogInformation($"ServiceAop同步返回结果:{JsonConvert.SerializeObject(invocation.ReturnValue)}");
} protected override void AfterProceedAsync(IInvocation invocation, bool hasAsynResult)
{
_logger.LogInformation($"ServiceAop异步返回结果:{JsonConvert.SerializeObject(invocation.ReturnValue)}");
}
}

两个类放在了新建的Aop文件夹里,通过Autofac注入进行使用,修改 Startup.cs 代码如图:(不太明白的请看:(五)Autofac

3、使用效果

二、前人栽树,后人乘凉

https://blog.csdn.net/q932104843/article/details/97611912

https://www.cnblogs.com/wswind/p/13863104.html

最新文章

  1. java 中多线程之间的通讯之等待唤醒机制
  2. uva12546. LCM Pair Sum
  3. paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
  4. OpenGl从零开始之坐标变换
  5. 【转载】TCP协议疑难杂症全景解析
  6. linux上安装mysql及简单的使用
  7. Oracle 数据备份、恢复以及导入时表空间不存在的解决方案
  8. 【BZOJ2243】【SDOI2011】染色
  9. SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)
  10. django连接sqlserver
  11. [Swift]LeetCode164. 最大间距 | Maximum Gap
  12. Grapher--寂寞无名的神器
  13. 海外aws-ubuntu-16.04系统使用ansible安装tidb
  14. vue-cli sass安装
  15. 64位JDK+tomcat6+myeclipse 10安装与配置
  16. Java调用SQL Server存储过程
  17. 【转】【WPF】WPF MVVM 简单实例
  18. 百度Cafe原理--Android自动化测试学习历程
  19. Windows服务器PHPstudy配置安装微擎教程
  20. Android的/system/lib里加入自己的so库

热门文章

  1. iOS中播放音效
  2. java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系
  3. 在MacOS安装puppeteer
  4. nginx 练习(将游戏图片部署到NFS+LNMP架构简介+uwsgi架构简介)
  5. Solution Set -「LOCAL」冲刺省选 Round XXII
  6. 我们一起来学Shell - shell的数组
  7. python-基础编程练习题
  8. Typora的使用教程.md
  9. 通俗理解.NET 6 Minimal APIs
  10. [自动化]ansible-系统安全加固整改