博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用反射+AOP,封装Basehandler
阅读量:5332 次
发布时间:2019-06-14

本文共 4357 字,大约阅读时间需要 14 分钟。

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式运行期动态代理实现程序功能统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。例如,在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

总结,所有设计模式追求的是调用者与被调用者的解耦(这样可以提高代码的灵活性和可扩展性),AOP作为一种设计模式的延伸,它分离了应用的业务逻辑与系统级服务(不仔细分都是业务逻辑),通过预编译和动态代理实现程序功能的。(想一想shtml中的#include,[Obsolete("hehe", false)]不也是一种标记,然后动态执行吗,另外,
预处理和动态执行应该总是结合在一起使用的

public class test1 : IHttpHandler    {        [ObsoleteAttribute("hehe", false)]        public void ProcessRequest(HttpContext context)        {                       Type type = typeof(test1);            object[] attr = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);            ObsoleteAttribute ra= (ObsoleteAttribute)attr[0];            string ss = ra.Message;  //hehe                bool ii = ra.IsError;    //false        }

 

Attribute可以省略,附加的Attribute类中的属性只能是常量。([ObsoleteAttribute(DateTime.Now.ToString(), false)],是错误的)。
 
 自定义Attribute
public class LsAttribute:Attribute    {                private string message;        public string Message        {            get { return this.message; }            set { this.message = value; }        }        public LsAttribute(string message) {            Message = message;        }        public LsAttribute() { }    }}

完整调用

[Obsolete("hehe", false)]        //[LsAttribute(Message = "first")]   第一种方式        [LsAttribute("second")]    //第二种方式        public void ProcessRequest(HttpContext context)        {            context.Response.ContentType = "application/json";            string action = context.Request["action"];            if (action == "test")            {                string checkUserName = context.Request["checkUserName"];                string username = context.Request["username"];                string CheckPwd = context.Request["CheckPwd"];                string password = context.Request["password"];                if (checkUserName == "on" && CheckPwd == "on")                {                    AjaxHelper.WriteJson(context.Response, "ok", "", new { username = username, password = password });                }            }            Type type = typeof(test1);            object[] attr1 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(ObsoleteAttribute), false);            ObsoleteAttribute ra = (ObsoleteAttribute)attr1[0];            string ss = ra.Message;            bool ii = ra.IsError;            object[] attr2 = type.GetMethod("ProcessRequest").GetCustomAttributes(typeof(LsAttribute), false);            LsAttribute ls=(LsAttribute)attr2[0];            string lsMessage = ls.Message;        }

 最后应用到实际BaseHandler

public class BaseHandler:IHttpHandler,IRequiresSessionState    {        public bool IsReusable        {            get            {                return false;            }        }                public void ProcessRequest(HttpContext context)        {            AdminHelper.CheckAccess(context);            string action=context.Request["action"];            //规定:参数总都有一个action 参数,表示执行什么方法            //action要和处理这个action的方法名一样,并且有如下参数(HttpContext context)            //例如 action=list,则有一个方法 public void list(HttpContext context)            Type ctrlType = this.GetType();//得到子类类型,例如,CourseController            MethodInfo methodAction = ctrlType.GetMethod(action);//例如,拿到子类的list方法            if (methodAction==null)            {                throw new Exception("action 不存在");            }            object[] paAttrs = methodAction.GetCustomAttributes(typeof(PowerActionAttribute), false);            if (paAttrs.Length>0)            {                PowerActionAttribute powerAction=(PowerActionAttribute)paAttrs[0];                AdminHelper.CheckPower(powerAction.Name);            }            methodAction.Invoke(this, new object[] { context });        }    }
PowerActionAttribute
[AttributeUsage(AttributeTargets.Method)]    public class PowerActionAttribute:Attribute    {        public string Name { get; set; }        public PowerActionAttribute(string name)        {            this.Name = name;        }    }

 

 

转载于:https://www.cnblogs.com/John-Marnoon/p/5951616.html

你可能感兴趣的文章
python知识思维导图
查看>>
当心JavaScript奇葩的逗号表达式
查看>>
App Store最新审核指南(2015年3月更新版)
查看>>
织梦MIP文章内容页图片适配百度MIP规范
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>