• 一般处理程序结合反射技术统一执行客户端请求


    思考:

    在开发中,如果使用了模板技术+一般处理程序开发,应用中用户的请求可能在程序中都存在一个共性的操作。

    例如,每当执行请求时要检查用户是否是登陆,请求时检查用户是否具有相应权限等等的共性的操作,我们不可能每个页面都写上对于操作,那样显然不符合面向对象的思想,存在大量冗余。

    如何去解决呢?

    解决思路:

    • 创建一个父类实现IHttpHandler接口,让处理请求的一般处理程序实现这个接口,当一般处理程序接收到请求时,去统一执行父类里的ProcessRequest()方法。
    • 客户端发出的请求,要约定俗成的带上一个action的参数,参数的值就是一般处理程序里要执行的方法。
    • 当执行父类的ProcessRequest()方法时,利用反射获取当前一般处理程序的Type,前面说了action的值代表了当前请求执行的操作是什么,那么利用反射找到指定的方法然后执行它。

    这样而来,可以让共性的操作在父类里完成,而具体的方法实现在子类里完成


    范例代码:

    子类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using Blog.Common;
     6 namespace Blog.UI.Article_category
     7 {
     8     /// <summary>
     9     /// Handler1 的摘要说明
    10     /// </summary>
    11     public class Article_category_Controller : BaseHandler
    12     {
    13 
    14         //方法名都要约定:每个请求名都为action,action的值,都是一般处理程序的方法
    15         public void list(HttpContext context)
    16         {
    17          string output=   RazorHelper.RazorParsre("/Article_category/template/Blog_Category.cshtml");
    18          context.Response.Write(output);
    19         }
    20             
    21 
    22      
    23     }
    24 }

    父类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Reflection;
     5 using System.Web;
     6 using System.Web.SessionState;
     7 namespace Blog.UI
     8 {
     9 
    10 
    11     public class BaseHandler:IHttpHandler,IRequiresSessionState
    12     {
    13 
    14         //一般处理程序会第一个执行    ProcessRequest()方法,它自己没有,会找父类要,让父类统一来执行请求
    15         public void ProcessRequest(HttpContext context)
    16         {
    17 
    18             /*
    19              在处理请求操作之前,这里可以处理应用程序要遵循的共性操作
    20              
    21              */
    22 
    23 
    24 
    25             
    26             //客户端每个请求约定俗成url带上一个参数叫action,action代表该请求执行什么操作
    27             if (string.IsNullOrEmpty(context.Request["action"]))
    28             {
    29                 return;
    30             }
    31             string action = context.Request["action"];
    32 
    33             //调用父类的方法,会是子类handler,利用反射获得类型
    34             Type ty = this.GetType();
    35             //根据这个类型,找到和action同名对应的方法,也就是说用action找到当前请求要执行的方法
    36             MethodInfo method = ty.GetMethod(action);
    37             if (method!=null)
    38             {
    39                 method.Invoke(this, new object[] { context });  //context是参数
    40                 return;
    41             }
    42 
    43 
    44         }
    45 
    46 
    47 
    48 
    49         public bool IsReusable
    50         {
    51             get
    52             {
    53                 return false;
    54             }
    55         }
    56 
    57 
    58 
    59     }
    60 
    61 
    62      
    63 
    64 }
  • 相关阅读:
    解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
    QProcess进程间双向通信
    DB2使用存储过程插入数据
    Qt自定义圆周动画(360 10.0 的模仿作者写的)
    经典重温:给微软上课的快乐车夫
    很劲爆!紫光赵伟国在北京微电子会议上12条惊人语录
    中芯国际董事长周子学:技术终有山顶,我们用时间换技术
    windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
    VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
    Qt判断和打开进程(windows端),运行,检测,中止
  • 原文地址:https://www.cnblogs.com/green-jcx/p/5930698.html
Copyright © 2020-2023  润新知