C#进阶疗法 -- 拦截器

代码拦截器入门指南:使用 Castle.DynamicProxy 实现方法拦截

什么是代码拦截器?

代码拦截器是一种设计模式,允许我们在不修改原有代码的情况下,在方法执行前后插入自定义逻辑。这种技术在很多场景下非常有用,属于aop编程的范畴,比如:

  • 日志记录
  • 性能监控
  • 事务管理
  • 权限验证
  • 异常处理

为什么需要代码拦截器?

在传统的代码编写中,如果我们需要为多个方法添加相同的逻辑(比如日志记录),通常需要在每个方法中重复编写这些代码,这会导致代码冗余和维护困难。使用代码拦截器,我们可以将这些通用逻辑集中到一个地方,然后应用到多个方法上,从而减少代码冗余,提高代码的可维护性。

如何使用 Castle.DynamicProxy 实现代码拦截器?

Castle.DynamicProxy 是一个强大的库,允许我们在运行时创建代理对象,从而实现方法拦截。下面我们将通过一个具体的示例来演示如何使用 Castle.DynamicProxy 实现代码拦截器。

步骤 1:安装 Castle.DynamicProxy 包

首先,我们需要在项目中安装 Castle.DynamicProxy 包。可以通过 NuGet 包管理器或者命令行来安装:

dotnet add package Castle.Core

步骤 2:创建拦截器类

接下来,我们需要创建一个拦截器类,实现IInterceptor接口:

usingCastle.DynamicProxy;namespaceFrameLearning.BasicComponents{/// <summary>/// 拦截器/// </summary>publicclassLogInterceptor:IInterceptor{publicvoidIntercept(IInvocationinvocation){Console.WriteLine($"开始调用:{invocation.Method.Name}");// 执行原方法invocation.Proceed();Console.WriteLine($"结束调用:{invocation.Method.Name},返回值:{invocation.ReturnValue}");}}}

在这个示例中,我们创建了一个LogInterceptor类,它实现了IInterceptor接口的Intercept方法。在Intercept方法中,我们首先打印出方法名,表示方法开始调用,然后调用invocation.Proceed()执行原方法,最后打印出方法名和返回值,表示方法结束调用。

步骤 3:注册拦截器和目标服务

在 Program.cs 文件中,我们需要注册拦截器和目标服务:

// 注册 Castle.DynamicProxy.ProxyGenerator 服务builder.Services.AddSingleton<Castle.DynamicProxy.ProxyGenerator,Castle.DynamicProxy.ProxyGenerator>();// 注册拦截器builder.Services.AddScoped<LogInterceptor>();// 注册目标服务(使用代理)builder.Services.AddScoped<IUserServer>(provider=>{// 从 DI 容器获取代理生成器varproxyGenerator=provider.GetRequiredService<ProxyGenerator>();// 从 DI 容器获取拦截器varinterceptor=provider.GetRequiredService<LogInterceptor>();// 创建目标服务实例vartarget=newUserServer();// 生成代理对象并返回returnproxyGenerator.CreateInterfaceProxyWithTarget<IUserServer>(target,interceptor);});

在这个示例中,我们首先注册了Castle.DynamicProxy.ProxyGenerator服务,然后注册了LogInterceptor拦截器,最后注册了IUserServer服务,但是我们返回的不是UserServer的直接实例,而是通过proxyGenerator.CreateInterfaceProxyWithTarget方法创建的代理对象,这个代理对象会应用我们的LogInterceptor拦截器。

步骤 4:创建目标服务接口和实现

我们需要创建目标服务接口和实现,以便拦截器可以拦截其方法调用:

// IUserServer.csnamespaceFrameLearning.Servers{publicinterfaceIUserServer{publicList<string>GetRoles();}}// UserServer.csnamespaceFrameLearning.Servers{publicclassUserServer:IUserServer{publicList<string>GetRoles(){List<string>roles=newList<string>();roles.Add("Admin");returnroles;}}}

在这个示例中,我们创建了一个IUserServer接口,它有一个GetRoles方法,然后创建了一个UserServer类,实现了这个接口。

步骤 5:使用拦截器

现在,我们可以在控制器中使用IUserServer服务,拦截器会自动拦截其方法调用:

[HttpPost("login")][AllowAnonymous]publicIActionResultLogin([FromBody]UserCredentialscredentials){varroles=_userServer.GetRoles();// 生成tokenvartoken=_jwtService.GenerateToken(credentials.Username,roles);returnOk(newUserResponse{Username=credentials.Username,Token=token,Roles=roles});}

在这个示例中,当我们调用_userServer.GetRoles()方法时,LogInterceptor会自动拦截这个调用,在方法执行前后打印日志。

代码拦截器的应用场景

代码拦截器在很多场景下都非常有用,下面列举几个常见的应用场景:

1. 日志记录

如我们在示例中所示,我们可以使用拦截器在方法执行前后记录日志,这样可以方便我们了解方法的执行情况,而不需要在每个方法中手动添加日志代码。

2. 性能监控

我们可以使用拦截器来监控方法的执行时间,从而了解哪些方法执行较慢,需要优化:

publicclassPerformanceInterceptor:IInterceptor{privatereadonlyILogger<PerformanceInterceptor>_logger;publicPerformanceInterceptor(ILogger<PerformanceInterceptor>logger){_logger=logger;}publicvoidIntercept(IInvocationinvocation){varstopwatch=Stopwatch.StartNew();try{invocation.Proceed();}finally{stopwatch.Stop();_logger.LogInformation($"方法{invocation.Method.Name}执行时间:{stopwatch.ElapsedMilliseconds}ms");}}}

3. 事务管理

我们可以使用拦截器来管理事务,确保方法执行过程中的所有操作都在一个事务中:

publicclassTransactionInterceptor:IInterceptor{privatereadonlyIDbContext_dbContext;publicTransactionInterceptor(IDbContextdbContext){_dbContext=dbContext;}publicvoidIntercept(IInvocationinvocation){usingvartransaction=_dbContext.Database.BeginTransaction();try{invocation.Proceed();transaction.Commit();}catch(Exception){transaction.Rollback();throw;}}}

4. 权限验证

我们可以使用拦截器来验证用户是否有权限执行某个方法:

publicclassAuthorizationInterceptor:IInterceptor{privatereadonlyIHttpContextAccessor_httpContextAccessor;publicAuthorizationInterceptor(IHttpContextAccessorhttpContextAccessor){_httpContextAccessor=httpContextAccessor;}publicvoidIntercept(IInvocationinvocation){varuser=_httpContextAccessor.HttpContext.User;if(!user.Identity.IsAuthenticated){thrownewUnauthorizedAccessException("用户未登录");}varrequiredRoles=invocation.Method.GetCustomAttributes<AuthorizeAttribute>().SelectMany(attr=>attr.Roles.Split(',')).ToList();if(requiredRoles.Any()&&!requiredRoles.Any(role=>user.IsInRole(role))){thrownewForbiddenAccessException("用户没有权限执行此操作");}invocation.Proceed();}}

总结

代码拦截器是一种强大的技术,允许我们在不修改原有代码的情况下,在方法执行前后插入自定义逻辑。使用 Castle.DynamicProxy,我们可以轻松实现代码拦截器,从而提高代码的可维护性和可扩展性。

在实际应用中,我们可以根据具体的需求,创建不同类型的拦截器,比如日志拦截器、性能监控拦截器、事务管理拦截器、权限验证拦截器等,从而实现各种横切关注点的分离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1194488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浙江正规的胶辊包胶供应商有哪些,泰兴金茂辊业特色显著

在工业生产领域,胶辊作为关键传动与加工部件,其性能直接影响生产线效率与产品质量。当胶辊出现磨损、老化或脱胶问题时,选择靠谱的旧胶辊包胶厂家、靠谱的胶辊包胶翻新供应商及正规的胶辊包胶供应商,成为企业降低成…

揭秘Java CORS跨域难题:5步快速配置,彻底解决前后端分离痛点

第一章&#xff1a;Java CORS跨域难题的本质解析CORS&#xff08;Cross-Origin Resource Sharing&#xff09;是浏览器实现的一种安全机制&#xff0c;用于限制不同源之间的资源请求。当Java后端服务与前端应用部署在不同域名或端口时&#xff0c;浏览器会发起预检请求&#xf…

Spring Cloud Gateway鉴权过滤器深度剖析(架构师私藏笔记曝光)

第一章&#xff1a;Spring Cloud Gateway鉴权过滤器核心概念解析 在微服务架构中&#xff0c;API网关作为系统的统一入口&#xff0c;承担着请求路由、限流、监控和安全控制等关键职责。Spring Cloud Gateway 作为 Spring 官方推出的响应式网关框架&#xff0c;提供了强大的过滤…

国产化替代中WordPress如何兼容信创环境公式编辑?

要求&#xff1a;开源&#xff0c;免费&#xff0c;技术支持 博客&#xff1a;WordPress 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 功能&#xff1a;导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台&#xff1a;Window…

收藏!大模型转型实战指南:从入门到求职,避坑全攻略

这两年&#xff0c;大模型技术彻底打破行业壁垒&#xff0c;从科研领域的专属议题&#xff0c;变成后端、测试、运维乃至跨行者的职业新选项&#xff0c;更是不少人职业转型的核心方向。 日常对接学员和行业朋友时&#xff0c;类似的疑问反复出现&#xff1a; “我做测试/运维多…

2025光纤滑环排行:国内热门款性能大PK,滑环定制/气动旋转接头/滑环/定制滑环/旋转接头,光纤滑环企业怎么选

随着5G通信、工业自动化与新能源装备的快速发展,光纤滑环作为旋转设备中实现光信号稳定传输的核心部件,其市场需求持续攀升。据行业统计,2025年国内光纤滑环市场规模预计突破25亿元,但产品同质化、技术参差不齐等问…

探讨膨胀管品牌商,南京哪家值得推荐,价格如何

一、基础认知篇 问题1:什么是膨胀罐?它在水循环系统中扮演什么角色? 膨胀罐是闭式水循环系统的核心稳压储能设备,依托罐内压缩气体与介质的压力动态平衡机制,实现系统压力的精准调节与稳定控制。其工作原理严格遵…

从Python到GPU加速:构建深度学习环境的6条黄金指令

第一章&#xff1a;Python环境的科学配置在现代软件开发中&#xff0c;Python 以其简洁语法和强大生态广受欢迎。然而&#xff0c;高效的开发始于科学的环境配置。合理管理 Python 版本与依赖包&#xff0c;不仅能避免“在我机器上能运行”的问题&#xff0c;还能提升团队协作效…

前端开发者如何在WordPress中实现Excel公式动态绑定?

要求&#xff1a;开源&#xff0c;免费&#xff0c;技术支持 博客&#xff1a;WordPress 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 功能&#xff1a;导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏 平台&#xff1a;Window…

为什么90%的人都写不对提取链接的正则?专家级避坑指南来了

第一章&#xff1a;为什么90%的人都写不对提取链接的正则&#xff1f;专家级避坑指南来了 在处理网页内容或日志分析时&#xff0c;提取URL是一个高频需求。然而&#xff0c;绝大多数人编写的正则表达式在实际应用中都会漏掉某些合法链接&#xff0c;甚至匹配到错误的内容。问题…

2026年消防水带厂家推荐:基于多场景实测评价,针对渗漏与霉腐痛点精准指南

消防水带作为消防灭火系统的核心输水部件,其性能与可靠性直接关系到应急救援的成败。当前,无论是大型工业设施、高层建筑还是社区消防系统,决策者在选择供应商时,普遍面临产品性能参差不齐、质量验证困难、长期耐用…

Java解决跨域问题完整指南(CORS配置从入门到生产级落地)

第一章&#xff1a;跨域问题的本质与CORS机制解析 在现代Web应用中&#xff0c;前端页面常需请求不同源的后端服务&#xff0c;而浏览器出于安全考虑实施了同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;限制了跨域HTTP请求。当协议、域名或端口任一不同时&a…

5.3 规模化管理:基于目录 vs 基于分支的多环境 多集群治理策略

5.3 规模化管理:基于目录 vs 基于分支的多环境/多集群治理策略 1. 引言:当应用数量从 10 到 100 单体应用迁到 K8s 尚可手工维护,微服务体量上来之后,环境维度(dev/staging/prod) 集群维度(多 Region/多租户/多云) 应用数量 会让任何脚本方案迅速失控。GitOps 的规模…

Vue.js vs React:全面对比

核心哲学差异方面Vue.jsReact设计理念渐进式框架声明式UI库核心思想"关爱开发者""拥抱函数式编程"学习曲线平缓&#xff0c;渐进式陡峭&#xff0c;概念较多模板 vs JSX模板为主JSX 为主1. 架构设计差异Vue - 渐进式框架<!-- Vue 2/3 模板语法 --> &…

仅需4步!快速将Python程序打包成小巧稳定的exe应用(附完整实例)

第一章&#xff1a;Python程序打包成exe的核心价值与应用场景 将Python程序打包为可执行文件&#xff08;.exe&#xff09;是提升项目交付效率和用户体验的重要手段。通过打包&#xff0c;开发者能够将依赖复杂的Python脚本及其运行环境封装为单一可执行文件&#xff0c;使最终…

2026年膨胀管厂家推荐,这几家在北上广口碑都不错

2026年工业给排水与循环系统领域持续升级,膨胀罐作为闭式水循环系统的核心稳压储能设备,其品质稳定性、技术适配性与成本控制能力,直接决定了暖通空调、消防供水、工业冷却等场景的系统运行效率与长期维护成本。无论…

【Maven依赖冲突排查与解决】:20年架构师亲授5大核心技巧,快速定位并解决依赖难题

第一章&#xff1a;Maven依赖冲突的本质与常见场景在Java项目开发中&#xff0c;Maven作为主流的构建工具&#xff0c;通过依赖管理极大提升了开发效率。然而&#xff0c;当多个依赖项引入相同库的不同版本时&#xff0c;便会发生依赖冲突。这种冲突可能导致类找不到、方法签名…

5.4 避坑指南:GitOps 生产环境常见故障排查与性能调优

5.4 避坑指南:GitOps 生产环境常见故障排查与性能调优 1. 引言:当 GitOps 落地到生产 GitOps 不是银弹。落地后你很快会遇到渲染差异、漂移风暴、同步性能、权限边界、密钥管理等一系列工程问题。本章按“现象 -> 诊断 -> 修复 -> 预防”的路径提供一线作战清单。…

【Java集合类深度解析】:HashMap底层实现原理揭秘与性能优化策略

第一章&#xff1a;HashMap的核心设计思想与演进历程哈希表的基本原理 HashMap 的核心在于将键值对通过哈希函数映射到数组的特定位置&#xff0c;从而实现 O(1) 时间复杂度的查找效率。理想情况下&#xff0c;每个键都能通过哈希算法唯一确定其存储索引&#xff0c;但实际中哈…

推荐靠谱的隔膜气压罐供应商,柏甲控制专业有保障

在现代建筑给排水、采暖与空调系统中,隔膜气压罐是保障管网压力稳定的核心设备,其性能直接关系到系统运行效率与安全。面对市场上良莠不齐的隔膜气压罐产品,如何选择靠谱的供应商成为众多工程方与企业的关键决策。以…