天天看點

C#注解

C#當中Attribute(中文注解屬性)已經知道這個概念已經很久很久了,不過悲劇的是在實際項目當中重來沒有用它來做過什麼東西,以緻對它的了解總是很淺薄,更談不上如何在實際項目中運用它。最近在學習<MVC3架構設計>這本書中,看到Filter這一章,突然悟到點感受,先分享如下:

感想一:Attribute大部分用在架構設計與元件設計中

我們平時開發的大部分是三層架構的Web項目,開發人員面向的客戶就是隻有自己。而架構設計或元件設計中,系統的目标是開發人員,是以整個系統的設計一部分架構設計者實作,另一部分由架構使用者(開發人員)來完成。就像asp.Net MVC架構一樣,微軟設計了Web項目的核心生命流程,如下圖

C#注解

而對于我們.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      

當架構實際執行時,會通過反射發現存在[CheckInLogin]這個特性,然後動态決定行為,去執行使用者定義的代碼。這樣做的好處時,通過Attribute機制将業務代碼與權限代碼很好的分離開發,代碼更簡潔,可了解性更強。如果沒有這個特性的話,判斷使用者登入的代碼就必須放在Action中完成,這樣造成了不相關的代碼耦合的在一起,使代碼更難維護和閱讀。

感想二:Web項目中也可以使用Attribute

有的童鞋要說了,我們這些碼農平時忙的連學習總結的時間也沒有,怎麼可能有時間做架構設計呢?那豈不是永遠也不可能正在用到Attribute?答案是否定,隻要你善于觀察、善于用心,項目中同樣可以用到這個特性。對于如何應用,下次再讨.....

繼續閱讀