文章出處
文章列表
思考:
在開發中,如果使用了模板技術+一般處理程序開發,應用中用戶的請求可能在程序中都存在一個共性的操作。
例如,每當執行請求時要檢查用戶是否是登陸,請求時檢查用戶是否具有相應權限等等的共性的操作,我們不可能每個頁面都寫上對于操作,那樣顯然不符合面向對象的思想,存在大量冗余。
如何去解決呢?
解決思路:
- 創建一個父類實現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 }
文章列表
全站熱搜