文章出處

思考:

在開發中,如果使用了模板技術+一般處理程序開發,應用中用戶的請求可能在程序中都存在一個共性的操作。

例如,每當執行請求時要檢查用戶是否是登陸,請求時檢查用戶是否具有相應權限等等的共性的操作,我們不可能每個頁面都寫上對于操作,那樣顯然不符合面向對象的思想,存在大量冗余。

如何去解決呢?

 

解決思路:

  • 創建一個父類實現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 }

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()