Mbp应用服务层的AOP实现
实现方法:asp.net core mvc 筛选器 + 中间件
日志,事务,和接口返回结果统一格式化采用操作筛选器,而异常处理采用中间件来处理.
最开始,我是打算用autofac的高级特性的拦截器来做AOP的,但是遇到一个问题,poco controller没办法注入到autofac的容器里面.导致拦截器不能正常工作,所以就采用了筛选器来做.这里的场景有以下几个:
- AOP是在应用层,而应用层是用poco controller做的,而在asp.net core web api的基架中,controller处在管线的末端.所以可以在这层进行全局拦截.
- 中间件处理异常更加灵活,可以有更多的定制化需求,而异常筛选器是响应抓捕的异常来处理,它相当于是异常发生后的一个处理程序,而中间件可以来实现类似异常筛选器.
- 中间件不短路,只是在程序运行的管线上添加了try catch,同时也解决了异步方法出现的异常无法被捕获的问题.
实现代码
- Mbp.AspNetCore.Filter 添加MbpLogFilter,MbpTransActionFilter,ResponseMiddleware三个操作筛选器
- Mbp.AspNetCore.Middleware 添加MbpGlobaExceptionMiddleware中间件
- 在模块MbpAspNetCoreModule中注册筛选器和中间件
public override IServiceCollection AddServices(IServiceCollection services)
{
services.AddMvc().AddNewtonsoftJson(options =>
{