利用Attribute实现Aop消息拦截
Aop“面向切面编程”,与OOP“面向对象编程”一样是一种编程思路。个人理解:在不改变原有逻辑的基础上,注入其他行为。
基础代码(仿MVC拦截器实现)
- namespace HGL.Toolkit.Aop
- {
- [AttributeUsage(AttributeTargets.Class,AllowMultiple=true)]
- publicsealedclassAopAttribute:ContextAttribute,IContributeObjectSink
- {
- publicAopAttribute():base("Aop"){}
- //实现IContributeObjectSink接口当中的消息接收器接口
- publicIMessageSinkGetObjectSink(MarshalByRefObject obj,IMessageSinknext)
- {
- returnnewAopProxy(next);
- }
- }
- [AttributeUsage(AttributeTargets.Method,AllowMultiple=true)]
- publicclassAopMethodAttribute:Attribute
- {
- /// <summary>
- /// 方法执行之前,执行代码
- /// </summary>
- publicvirtualboolOnMethodExecuting(System.Web.HttpContext context)
- {
- returntrue;
- }
- /// <summary>
- /// 方法执行之后,执行代码
- /// </summary>
- publicvirtualboolOnMethodExecuted(System.Web.HttpContext context)
- {
- returntrue;
- }
- }
- }
- namespace HGL.Toolkit.Aop
- {
- publicsealedclassAopProxy:IMessageSink
- {
- //下一个接收器
- privateIMessageSink nextSink;
- publicIMessageSinkNextSink
- {
- get{return nextSink;}
- }
- publicAopProxy(IMessageSink nextSink)
- {
- this.nextSink = nextSink;
- }
- //同步处理方法
- publicIMessageSyncProcessMessage(IMessage msg)
- {
- IMessage retMsg =null;
- //方法调用消息接口
- IMethodCallMessage call = msg asIMethodCallMessage;
- var attributes =Attribute.GetCustomAttributes(call.MethodBase,typeof(AopMethodAttribute));
- //如果被调用的方法没打AopMethodAttribute标签
- if(call ==null|| attributes.Count()==0)
- {
- retMsg = nextSink.SyncProcessMessage(msg);
- }
- //如果打了AopMethodAttribute标签
- else
- {
- foreach(var attribute in attributes)
- {
- var obj = attribute.GetType();
- var executing = obj.GetMethod("OnMethodExecuting");
- if(executing !=null)
- {
- var context=System.Web.HttpContext.Current;
- executing.Invoke(attribute,newobject[]{ context });
- }
- }
- retMsg = nextSink.SyncProcessMessage(msg);
- foreach(var attribute in attributes)
- {
- var obj = attribute.GetType();
- var executed = obj.GetMethod("OnMethodExecuted");
- if(executed !=null)
- {
- var context =System.Web.HttpContext.Current;
- executed.Invoke(attribute,newobject[]{ context });
- }
- }
- }
- return retMsg;
- }
- //异步处理方法(不需要)
- publicIMessageCtrlAsyncProcessMessage(IMessage msg,IMessageSink replySink)
- {
- returnnull;
- }
- }
- }
使用注意:
- 1.使用到Aop的类必须继承ContextBoundObject
- 2.使用到Aop的方法存在的类必须添加[Aop]特性
- 3.哪个方法需要实现Aop,就给那个方法添加[AopMethod]特性
- AopMethod未实现任何业务逻辑,使用者需要重写该attribute
- /// <summary>
- /// 方法执行之前,执行代码
- /// </summary>
- publicvirtualboolOnMethodExecuting()
- {
- returntrue;
- }
- /// <summary>
- /// 方法执行之后,执行代码
- /// </summary>
- publicvirtualboolOnMethodExecuted()
- {
- returntrue;
- }
待续......(将执行前和执行后的方法使用代理委托机制,实现二次开发)
出处:https://www.bbsmax.com/A/lk5ar87md1/
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/15883625.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-02-11 JavaScript语法支持严格模式 -- "use strict"
2020-02-11 Javascript中判断 Undefined 还是 Null 的方法
2014-02-11 删除临时文件,清理IE和使用历史痕迹
2014-02-11 系列文章--从零开始学习ASP.NET MVC 1.0
2014-02-11 系列文章--jQuery教程
2014-02-11 HTTP 返回状态消息讲解
2014-02-11 在IIS上启用Gzip压缩(HTTP压缩)