Asp.Net 三層架構之泛型應用

來源:互聯網
上載者:User

標籤:

 一說到三層架構,我想大家都瞭解,這裡就簡單說下,Asp.Net三層架構一般包含:UI層、DAL層、BLL層,其中每層由Model實體類來傳遞,所以Model也算是三層架構之一了,例外為了資料庫的遷移或者更OO點,DAL層就衍生出了IDAL介面。Model就是簡單的對應資料庫裡面的類,DAL層就是主要操作資料庫的方法了,BLL這個就看業務了。而DAL層大部分的方法都是差不多,無非就是幾個Insert,Update,Delete,Select。

      再來說下泛型,這個是2.0才開始有的,算是2.0中一個非常重要的技術了,關於泛型有什麼好處優點就不說了,網上一大堆,其實說了也沒有什麼用,大家在實踐中運用了就知道,我覺得泛型一個最核心的地方就是,泛型封裝了類型,把類型的定義延遲到了用戶端,泛型又像一個類型的模板,只要你定義了一個泛型類,就相當於定義了N個類,每個類的類型不一樣而已。

      上面我們說了,三層架構中的DAL層一般包括Insert,Update,Delete,Select這幾種了,那麼在泛型還沒有到來之前,我們的程式員兄弟一般是怎麼做的,首先為每個實體定義一個DAL介面,比如有個User這個實體物件,那麼就有一個IUserDAL這個介面以及UserDAL這個實作類別,如果有N個實體,那麼差不多就需要N個介面和實作類別了,而這些介面中的Insert,Update,Delete,Select的方法簽名都是類似的,唯一的不同就是方法參數和傳回值的類型了,我們來看下基本的介面定義

public interface IUserDAL
    {
        int Insert(User model);
        int Update(User model);
        int Delete(int id);
        User GetModel(int id);
        DataTable GetList();
    }

那麼在一個項目中,像這樣的介面定義到處可見,大部分是重複的寫法,雖然我們有任勞任怨的代碼產生工具為我們效勞,但是從設計角度或者站在新技術的角度看,這些代碼就顯得很不優雅,很不爽了,我想你的感覺也是這樣吧,呵呵O(∩_∩)O~。

       當泛型來臨時,我們終於可以不看到那麼多的重複介面的定義了,終於可以喘一口氣了,那麼泛型又是怎麼實現的呢,在實現之前我們回頭看下我們沒有泛型的IUserDAL的定義,其中Insert,Update方法就一個User參數,類似的其他介面也就一個參數,只是類型不是User了,可能是Order,或者其他的,在來看下GetModel傳回值類型是User,GetList也是一樣的,只是這裡我們用DataTable這個萬能的類型來代替了,但是大家都知道DataTable這個類型臃腫又是弱類型的,在UI層調用的時候又不知道這個DataTable裡面到底有什麼欄位,這個就在開發期帶來一定的麻煩。

      泛型的實現終於上場了,其實很簡單,不就是一對角括弧嗎,是的,只要在IUserDAL後面加對角括弧,裡面用一個字元代替類型就可以了,哦,對了還要加個泛型約束呢,就是一個where,也就是說,這個泛型的類型只能是引用的類型,不能是實值型別,難道你的Model是一個實值型別??不可能吧,反正我是不信。那麼這個泛型介面的定義就是:

public interface IDAL<T> where T : class
    {
        int Insert(T model);
        int Update(T model);
        int Delete(int id);
        T GetModel(int id);
        IList<T> GetList();
    }

  哦,原來那麼簡單就是加個T把之前的User類型給【換了】就可以啦,我怎麼沒有想到呢,嗚嗚,那麼在UserDAL這個繼承類中就可以明確定義那個泛型的類型了,因為我這個類就是用來實現User這個實體類的(或者說資料庫的表吧),這裡,UserDAL我們就叫IUserDAL的用戶端了。代碼如下:

public class UserDAL : IDAL<User>
    {
        #region IDAL<User> 成員

        public int Insert(User model)
        {
            //coding
        }

        public int Update(User model)
        {
            //coding
        }

        public int Delete(object id)
        {
            //coding
        }

        public User GetModel(object id)
        {
            //coding
        }

        public IList<User> GetList()
        {
            //coding
        }

        #endregion
    }

 

  好了,我們解放了DAL和IDAL,那麼BLL層可以用泛型嗎,當然可以。

       我們先來說下,不用泛型的BLL層的實現,這裡不考慮BLL的業務的話,那麼BLL就是單純的調用DAL的相關資料庫操作方法,也就是那個IUserDAL介面定義的方法了,一般的UserBLL代碼如下:

 

public class UserBLL
    {
        private IUserDAL dal = new UserDAL();

        public int Insert(User model)
        {
            return dal.Insert(model);
        }

        public int Update(User model)
        {
            return dal.Update(model);
        }
        public int Delete(int id)
        {
            return dal.Delete(id);
        }
        public T GetModel(int id)
        {
            return dal.GetModel(id);
        }
        public DataTable GetList()
        {
            return dal.GetList();
        }
    }

  我想這個是最簡單的BLL代碼了,而且大部分小的項目這樣就已經夠了,因為沒有什麼業務嘛,但是如果想這樣的代碼每個BLL都這樣謝,一個項目幾十個上百個也這樣寫真的會累死人的,代碼工具雖然可以解決,但是當我們看到那麼多的重複代碼,相似的代碼,真的很心痛,難道你不覺得心痛,如果你不覺得或者也不想去改的話或者以後還是那樣寫重複的代碼,用代碼工具幫做的話,我想你的code能力也不會怎麼提高,廢話一下。

      那麼用泛型的話,我們就可以為所有的BLL定義一個基類,其他類只要繼承下,稍微的根據業務的不同增加點業務代碼就可以,甚至都可以不用繼承了,我們先看代碼的實現吧,搞這行代碼才是最好說話的,請看下面代碼:

public class BaseBLL<T, D>
        where T : class
        where D : IDAL<T>,new ()
    {
        private D dal = new D();

        public virtual int Insert(T model)
        {
            return dal.Insert(model);
        }

        public virtual int Update(T model)
        {
            return dal.Update(model);
        }
        public virtual int Delete(object id)
        {
            return dal.Delete(id);
        }
        public virtual T GetModel(object id)
        {
            return dal.GetModel(id);
        }
        public virtual IList<T> GetList()
        {
            return dal.GetList(model);
        }
    }

  這個也簡單把,也就是把實體類換為T,把IDAL介面換為D,並定義D這個類型的約束,也就是說我的這個D一定是一個實現了IDAL<T>這個介面的,而IDAL角括弧裡面的T就是BaseBLL裡面的T,看到這裡,相信大家都應該明白了,如果你想實現UserBLL,就可以繼承BaseBLL這個基類,這裡為什麼把BaseBLL中的方法定義為virtual呢,原因很簡單的,因為你的BLL層的其他類不可能就沒有業務,不可能就是簡單的調用DAL方法吧,其他的BLL類就可以根據業務去override相關的方法了,UserBLL相應代碼如下:

public class UserBLL : BaseBLL<User, UserDAL>
    {
        
     }

 如果UserBLL沒有任何業務的話,那就不要繼承了,在UI直接用BaseBLL這個泛型類就可以,調用也很簡單

       BaseBLL<User> dal=new BaseBLL<User>();這樣就可以了。

Asp.Net 三層架構之泛型應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.