.Net6 web API (AOP理解--ResourceFilter)
前沿
Aop(AspectorientProgramming),面向切面编程,作为面向对象编程的一种补充,可以在不破坏之前的封装
为基础动态增加一些功能;从而让系统更具备扩展性:
增加一个缓存功能 增加一个日志功能 既希望不要违背开闭原则,也希望能够增加新的工能 在之前的业务逻辑之前增加了逻辑, 在之前的业务逻辑之后增加了逻辑
在AOP中,横切关注点通常指的是与主要业务逻辑无关但在整个应用程序中多个地方都存在的功能,
例如日志记录、性能监控、事务管理、安全验证等。通过AOP,我们可以将这些横切关注点抽取出来,
并通过特定的技术(例如代理、装饰器等)将它们应用到主要业务逻辑中,而不需要在业务逻辑中显式地编写这些代码。
举例代码:
新建代码目录
using System; using Microsoft.AspNetCore.Mvc.Filters; namespace yanfanNet6WebApi.Utility.Filters { /// <summary> /// 自定义 接口 /// </summary> // 继承 Attribute 并且实现接口话 IResourceFilter public class CustomResourceFilterAttribute : Attribute , IResourceFilter { /// <summary> /// 在莫某资源后 /// </summary> /// <param name="context"></param> /// <exception cref="NotImplementedException"></exception> public void OnResourceExecuted(ResourceExecutedContext context) { Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuted"); } /// <summary> /// 在莫某资源前 /// </summary> /// <param name="context"></param> /// <exception cref="NotImplementedException"></exception> public void OnResourceExecuting(ResourceExecutingContext context) { Console.WriteLine("CustomResourceFilterAttribute.OnResourceExecuting"); } } }
异步请求
using System; using Microsoft.AspNetCore.Mvc.Filters; namespace yanfanNet6WebApi.Utility.Filters { /// <summary> /// 自定义 AsyncResourceFilter /// </summary> public class CustomAsyncResourceFilterAttribute : Attribute, IAsyncResourceFilter { /// <summary> /// /// </summary> /// <param name="context"></param> /// <param name="next"></param> /// <returns></returns> public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) { Console.WriteLine("CustomAsyncResourceFilterAttribute OnResourceExecutionAsync"); await next.Invoke(); // 条用下一个 } } }
然后在控制器
新建
IResourceFilter
FilterController.cs 代码
using Microsoft.AspNetCore.Mvc; using yanfanNet6WebApi.Utility.Filters; using yanfanNet6WebApi.Utility.Swagger; namespace yanfanNet6WebApi.Controllers; /// <summary> /// 文件资源 /// </summary> [ApiController] [Route("[controller]")] [ApiVersion("2.0")] [Route("[controller]/v{version:apiVersion}")] public class FilterController : ControllerBase { private readonly ILogger<FilterController> _logger; public FilterController(ILogger<FilterController> logger) { _logger = logger; } /// <summary> /// 获取用户信息 /// </summary> /// <returns></returns> [HttpGet] [Route("{id:int}")] [CustomResourceFilterAttribute] public IActionResult GetUser(int id) { Console.WriteLine("==== 业务逻辑处理 ===="); var data = new { Id = id, Success = 234, Name = "fanfan", DateTime = DateTime.Now.ToString() }; return new JsonResult(data); } }
然后打断点:
移步同步扩展
运行:
然后你会发现会先到
OnResourceExecutionAsync 这个方法 里
再到控制里面的
就是可以在不碰业务代码的,可以在里面穿插一些其他功能的代码 比如 日志记录、性能监控、事务管理、安全验证
动态代理:通过动态代理技术,在运行时动态地为目标对象生成代理对象,代理对象可以在目标对象的方法执行前后执行横切关注点的代码。
在.NET中,可以使用框架如Castle DynamicProxy、Unity Interception等来实现动态代理。
属性:通过自定义属性(Attribute),可以将横切关注点与目标方法进行关联,并在运行时通过反射等方式来获取属性信息并执行相应的处理逻辑。例如,在ASP.NET Core中,可以使用特性如[Authorize]、[HttpPost]等来实现安全验证、HTTP方法匹配等功能。
依赖注入:通过依赖注入容器,可以在目标对象的创建过程中动态地为对象添加额外的行为。例如,可以通过在服务注册过程中使用装饰器模式来为服务添加缓存、日志等功能。
动态方法/委托:通过动态创建方法或委托对象,并在方法或委托的执行前后执行横切关注点的代码。在.NET中,可以使用Expression Trees、Func/Action等来动态创建方法或委托对