AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP能夠對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,提升代碼的靈活性和可擴展性,AOP能夠說也是這種目標的一種實現。例如,在Spring中提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。html
總結,全部設計模式追求的是調用者與被調用者的解耦(這樣能夠提升代碼的靈活性和可擴展性),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; }
最後應用到實際BaseHandlerjson
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; } }