C#當中Attribute(中文注解屬性)已經知道這個概念已經很久很久了,不過悲劇的是在實際項目當中重來沒有用它來做過什么東西,以致對它的理解總是很淺薄,更談不上如何在實際項目中運用它。最近在學習<MVC3框架設計>這本書中,看到Filter這一章,突然悟到點感受,先分享如下:
感想一:Attribute大部分用在框架設計與組件設計中
我們平時開發的大部分是三層架構的Web項目,開發人員面向的客戶就是只有自己。而框架設計或組件設計中,系統的目標是開發人員,所以整個系統的設計一部分框架設計者實現,另一部分由框架使用者(開發人員)來完成。就像asp.Net MVC框架一樣,微軟設計了Web項目的核心生命流程,如下圖
而對於我們.Net的開發人員,只需要在這個HTTP框架流程管道中掛接自己的代碼,就像乘上這班車一樣就能順利達到目的地。如在Controller中定義自己的Action,讀取數據庫,然后返回給ViewEngine。
話又回到我們的主題:這些與Attribute有什么關系呢?
當然有關系,框架的設計者為了給開發人員更多的接口,更多選擇,所以定義很多Attribute供開發人員選擇使用,來指定不同的框架功能。
舉例:當開發人員需要利用Filter特性來驗證用戶登錄情況,如下圖
public class CheckinLoginAttribute:ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Session["user"] == null) { filterContext.HttpContext.Response.Redirect("/User/Login"); } } } public class HomeController : Controller { // // GET: /Home/ [CheckinLogin] public ActionResult Index() { return View(); } }
當框架實際執行時,會通過反射發現存在[CheckInLogin]這個特性,然后動態決定行為,去執行用戶定義的代碼。這樣做的好處時,通過Attribute機制將業務代碼與權限代碼很好的分離開發,代碼更簡潔,可理解性更強。如果沒有這個特性的話,判斷用戶登錄的代碼就必須放在Action中完成,這樣造成了不相關的代碼耦合的在一起,使代碼更難維護和閱讀。
感想二:Web項目中也可以使用Attribute
有的童鞋要說了,我們這些碼農平時忙的連學習總結的時間也沒有,怎么可能有時間做框架設計呢?那豈不是永遠也不可能正在用到Attribute?答案是否定,只要你善於觀察、善於用心,項目中同樣可以用到這個特性。對於如何應用,下次再討.....
總結:
盡管頓悟出這么一點感受,但是畢竟還沒有真正在項目中應用過,對它的理解與掌握還是任重而道遠。我一直認為沒有在實踐中真實解決問題的經驗,對知識的理解永遠是停留在表面,不管你理論上理解的有多透徹。