天天看點

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

        分層是為了減少層與層之間的依賴,增加程式的可讀性,讓整個系統結構清晰明确,還可大大降低維護成本,但是分層也有一定的缺點,有些可以直接通路資料庫的層,卻要通過負責通路資料庫的層進行通路,這樣,在通路資料庫過程中就多出一個環節,增加了系統的開銷,有時候要在表示層增加某個功能,為了降低耦合,就不得不自上而下,在每一層裡面增加這個功能所需的服務類,這樣就增加了開發成本

        分層越多越好嗎?答案是否定的,引用一句話“我們也要     時刻謹記:不能盲目分層,不應分層而分層不應模式而模式。這是很重要的。不然隻能增加開發的負擔(在今後的實踐中更好的體會)。”應該是說要根據實際的情況進行分層,畢竟不是絕對的,因為有些系統不分層比分層有點更多一些。

基本的分層主要用的是三層架構:

       表示層(UI)

       主要用于與使用者的互動,負責傳達使用者的指令以及資料給BLL層,并把使用者需要的資料顯示出來,通俗的講就是使用者能見到的界面,如窗體程式。

       業務邏輯層(BLL)

       對資料的邏輯處理,比如把通路資料庫得到的資料,轉換成使用者向看到的資料,并送出給表示層進行顯示。

       資料通路層(DAL)

       對資料庫進行通路,提供增删改查等操作。

下面是我的包圖,每個包就是一個層,其中增加了實體層(Model)、接口層(IDAL)和工廠層(Factory)

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

實體層(Model)

實際上就是對應的資料庫裡面的每一張表,一個表就建一個類,一個類裡面的屬性則是對應表裡面的字段,比如表BaseData_Info

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

在實體層中,就可以這樣建立一個類:

         有什麼用呢?當你需要注冊一個使用者時候,你得從表示層(UI)把資料傳遞給用于通路資料庫的資料通路層(DAL),但是,你不可能把使用者注冊的資訊:學号,姓名,卡号,注冊日期,注冊時間,班級。。。。。。等等把參數傳遞給函數,進行增加行操作吧?

對于資料庫的通路,基本上什麼語言都離不開這麼幾步:

1.      連接配接資料庫

2.      執行sql語句

3.      傳回sql語句的執行結構

       而連接配接資料庫的字元串,大家可以參考

       執行sql語句可以參考

       下面是一個簡單的資料庫通路例子:

        其中連接配接資料庫要用到的對象是SqlConnection,執行查詢語句以及傳回結果用的是SqlDataAdapter對象。

       資料庫的連接配接有很多種方式,如本地、遠端等。隻要參考參考資料庫連接配接字元串,依據自身情況進行選擇使用就可以達到目的。

          對于反射,一開始我非常的茫然,在設計模式裡面敲了例子之後,查了很多資料,也不知道怎麼應用到收費系統中,确實笨到家了。不過,後來看到了高人的部落格,才會了。看下圖:

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

          假如說你有BLL和DAL2個層,你希望在BLL裡面的一個類A使用DAL裡面的BalanceDAL類,你可以通過引用DAL進而達到目的,但是,據說為了減少BLL與DAL的耦合性,是以在BLL和DAL之間加了個接口層叫IDAL。如下圖

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

          可以看到框中的是上面DAL裡面BalanceDAL的接口,這個接口裡面包含了具體類(BalanceDAL)的所有方法,是以我們隻要調用接口,就相當于調用了具體類(BalanceDAL),但是,前提是你必須把接口和具體類接通,就好比電視機和遙控器,遙控器是電視機接口,要想遙控器能控制接口,電視機裡面應該要有一個能夠接收并處理紅外線新号的裝置,當你使用遙控器的時候,遙控器跟電視機是聯通的,他們之間通過了紅外線聯通。事實上,接口與具體類之間的關系,隻是兩者之間建立了一條管道,接口中沒有具體的功能,但卻有那個具體類使用的一個方法(就像遙控器上的按鍵),如果遙控器跟電視機之間沒有聯通,那麼你按一下遙控器,是不會實作開機或者調頻等功能的,是以,要使用接口,必須讓接口與具體實作的類進行聯通,這裡有兩步走,第一步是引用,第二步是建立執行個體。看下圖:

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層
重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

        在DAL的引用裡把IDAL打上勾就行了也就相當于在這兩個層之間架起了橋梁,接下來,我們讓DAL來實作這個接口,也就是在DAL裡面建立具體類之後,寫上關鍵字+你要實作的接口,然後回車,它就會自動列出你在接口裡寫的方法,然後再方法裡,你去具體的實作吧。

重構版機房收費系統之分層、接口、資料庫連接配接、反射+工廠(vb.net) 分層

        然後,我們需要在橋梁上面加管道,加了管道,就是把接口的方法和具體類的方法連接配接起來,使得我在BLL層裡面調用接口的方法,就相當于調用了具體類的方法,但是我BLL并不知道具體類到底是怎麼實作的,據說,這就是降低了BLL層與DAL層之間的耦合,因為我隻關心接口IDAL就行了。如下代碼,看BLL裡是如何使用接口

        這裡,我們首先引用了反射,然後建立接口(IBalance),再然後就是通過反射,把DAL層裡的BalanceDAL具體類的執行個體反射過來給接口,這樣,我們就相當于在接口和具體類之間連接配接了管道,然後我們就可以使用具體類的方法了:IBalance.SelectBalanceInfo(CardID)‘查詢并傳回資料集結果

        後來發現,把DAL層裡面的類反射到BLL層裡面,也就相當于在BLL層裡面生産了DAL層的類,然後反射得到具體類的那些代碼,我便抽象出了一個層,名曰Factory層,隻要BLL引用工廠,便可以通過工廠傳回具體類了。這也就是反射+工廠的應用吧。

        好像寫的有點長,本來還有重載、配置檔案、異常處理、存儲過程等比較實用點的技術要寫的,算了,放到下一篇吧。希望對大家有幫助。

        雖說面向對象比較複雜,但是總體的感覺,它就是把很多複雜的東西分類、分塊、分層、分......然後用線把他們竄起來,你不必完全的記住所有的分塊,但你可以順着那些圖紙毫不保留的了解到細節,隻要去習慣這樣的思維方式,相信也不太難的。

繼續閱讀