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

來源:互聯網
上載者:User

標籤:password   get   iba   重載   查詢語句   調用   html   部落格   對象   


分層

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

        分層越多越好嗎?答案是否定的,引用一句話“我們也要     時刻謹記:不能盲目分層,不應分層而分層不應模式而模式。

這是非常重要的。不然僅僅能添加開發的負擔(在今後的實踐中更好的體會)。”應該是說要依據實際的情況進行分層,畢竟不是絕對的,由於有些系統不分層比分層有點很多其它一些。

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

       展示層(UI)

       主要用於與使用者的互動,負責傳達使用者的指令以及資料給BLL層。並把使用者須要的資料顯示出來,通俗的講就是使用者能見到的介面,如視窗程序。

       商務邏輯層(BLL)

       對資料的邏輯處理。比方把訪問資料庫得到的資料,轉換成使用者向看到的資料,並提交給展示層進行顯示。

       資料訪問層(DAL)

       對資料庫進行訪問,提供增刪改查等操作。

 

以下是我的包圖,每一個包就是一個層,當中添加了實體層(Model)、介面層(IDAL)和工廠層(Factory)



實體層(Model)

實際上就是相應的資料庫裡面的每一張表。一個表就建一個類。一個類裡面的屬性則是相應表裡面的欄位,比方表BaseData_Info


在實體層中,就能夠這樣建立一個類:

Public Class BaseDataEntity    Inherits Entity      Private FixedUserHalfHourCost As Single      ‘固定使用者半小時花費    Public Property FixdUserHalfHourCost_ As Single        Get            Return FixedUserHalfHourCost        End Get        Set(value As Single)            FixedUserHalfHourCost = value        End Set    End Property     Private CasualUserAnHourCost As Single   ‘暫時使用者一小時花費    Public Property CasualUserAnHourCost_ As Single        Get            Return CasualUserAnHourCost         End Get        Set(value As Single)            CasualUserAnHourCost = value        End Set    End Property     Private IncreasingUnitTime As Single    ‘單位遞增時間    Public Property IncreasingUnitTime_ As Single        Get            Return IncreasingUnitTime        End Get        Set(value As Single)            IncreasingUnitTime = value        End Set    End Property      Private AtleastOnlineTime As Single      ‘最少線上時間    Public Property AtleastOnlineTime_ As Single        Get            Return AtleastOnlineTime        End Get        Set(value As Single)            AtleastOnlineTime = value        End Set    End Property     Private ReadyTime As Single     ‘準備時間    Public Property ReadyTime_ As Single        Get            Return ReadyTime        End Get        Set(value As Single)            ReadyTime = value        End Set    End Property     Private AtleastMoney As Single      ‘最少金額    Public Property AtleastMoney_ As Single        Get            Return AtleastMoney        End Get        Set(value As Single)            AtleastMoney = value        End Set    End Property End Class


         有什麼用呢?當你須要注冊一個使用者時候,你得從展示層(UI)把資料傳遞給用於訪問資料庫的資料訪問層(DAL),可是。你不可能把使用者注冊的資訊:學號。姓名,卡號,注冊日期,注冊時間,班級。。

。。。。等等把參數傳遞給函數。進行添加行操作吧?

    ’你該不會真的這麼傳值吧?被嚇到了    AddUser(StudentID,StudentName,CardID,RegisterDate,RegisterTime,Class。

。。。

。。) ’而假設你把這些資料封裝成一個類。如上述,你僅僅須要傳遞一個類即可了 AddUser(UserInfo)

資料庫連接

對於資料庫的訪問,基本上什麼語言都離不開這麼幾步:

1.      串連資料庫

2.      運行sql語句

3.      返回sql語句的運行結構

       而串連資料庫的字串,大家能夠參考資料庫連接字串大全

       運行sql語句能夠參考sql語句大全

       以下是一個簡單的資料庫訪問範例:

ImportsSystem.Data.SqlClient   ’引用sqlclientPublic Class SelectDAL    Public Overloads Function SelectInfo(ByVal Table As String)     ‘查詢整張表        Dim DataS As New DataSet        Try            Dim SelectStr As String = "select * from " & Table     ‘查詢語句            Dim ConnectStr As String ="Data Source=server名/server地址;Initial Catalog=資料庫名; UserID=sa;Password=123"‘資料庫連接字串            Dim DBConnection As New SqlConnection(ConnectStr) ‘初始化資料庫連接對象             DBConnection.Open() ‘串連資料庫            ‘Dim DBCmd As New SqlCommand(SelectStr,DBConnection)    ‘執行查詢語句            Dim Adapter As New SqlDataAdapter(SelectStr,DBConnection)  ‘把查詢結果儲存到緩衝中             Adapter.Fill(DataS, Table)      ‘把緩衝中的表以Table為名儲存到DataSet中          Catch ex As Exception            Throw New ArgumentOutOfRangeException(""& ex.Message)       End Try         Return DataS End Function

        當中串連資料庫要用到的對象是SqlConnection。執行查詢語句以及返回結果用的是SqlDataAdapter對象。

       資料庫的串連有非常多種方式,如本地、遠程等。

僅僅要參考參考資料庫連接字串,根據自身情況進行選擇使用就能夠達到目的。

反射+工廠、介面

          對於反射,一開始我非常的茫然,在設計模式裡面敲了範例之後。查了非常多資料。也不知道怎麼應用到收費系統中。確實笨到家了。

只是,後來看到了高人的部落格。才會了。

看:


          假如說你有BLL和DAL2個層,你希望在BLL裡面的一個類A使用DAL裡面的BalanceDAL類,你能夠通過引用DAL從而達到目的,可是,據說為了降低BLL與DAL的耦合性。所以在BLL和DAL之間加了個介面層叫IDAL。

例如以


          可以看到框中的是上面DAL裡面BalanceDAL的介面。這個介面裡麵包括了詳細類(BalanceDAL)的全部方法。所以我們僅僅要調用介面。就相當於調用了詳細類(BalanceDAL),可是,前提是你必須把介面和詳細類接通。就好比電視機和遙控器,遙控器是電視機介面,要想遙控器能控制介面。電視機裡面應該要有一個可以接收並處理紅外線新號的裝置,當你使用遙控器的時候。遙控器跟電視機是聯通的,他們之間通過了紅外線聯通。

其實,介面與詳細類之間的關係,僅僅是兩者之間建立了一條管道。介面中沒有詳細的功能,但卻有那個詳細類使用的一個方法(就像遙控器上的按鍵),假設遙控器跟電視機之間沒有聯通,那麼你按一下遙控器,是不會實現開機或者調頻等功能的。所以,要使用介面,必須讓介面與詳細實現的類進行聯通,這裡有兩步走。第一步是引用,第二步是建立執行個體。看:



        在DAL的引用裡把IDAL打上勾即可了也就相當於在這兩個層之間架起了橋樑。接下來。我們讓DAL來實現這個介面,也就是在DAL裡面建立詳細類之後。寫上keyword+你要實現的介面,然後斷行符號。它就會自己主動列出你在介面裡寫的方法,然後再方法裡。你去詳細的實現吧。


        然後,我們須要在橋樑上面加管道,加了管道,就是把介面的方法和詳細類的方法串連起來。使得我在BLL層裡面調用介面的方法。就相當於調用了詳細類的方法,可是我BLL並不知道詳細類究竟是怎麼實現的,據說。這就是減少了BLL層與DAL層之間的耦合,由於我僅僅關心介面IDAL即可了。例如以下代碼,看BLL裡是怎樣使用介面

Imports System.Reflection           ’反射的引用Public ClassBalanceBLL    FunctionBalanceQuery(ByVal CardID AsString)        IfCardID = "" Then            ThrowNewArgumentOutOfRangeException("","請輸入卡號:")        EndIf         DimIBalance As IDAL.IBalance    ‘剩餘金額介面       IBalance = CType(Assembly.Load("DAL").CreateInstance("DAL.BalanceDAL"),IDAL.IBalance)   ‘得到剩餘金額類        DimDS As NewDataSet        Try            DS = IBalance.SelectBalanceInfo(CardID) ‘查詢並返回資料集結果            IfDS.Tables(0).Rows.Count < 1 Then               Throw NewArgumentOutOfRangeException("","沒有這個卡號的剩餘金額記錄")            EndIf        Catchex As Exception            ThrowNewArgumentOutOfRangeException("",ex.Message)        EndTry        ReturnDS    EndFunction

        這裡,我們首先引用了反射,然後建立介面(IBalance),再然後就是通過反射。把DAL層裡的BalanceDAL詳細類的執行個體反射過來給介面。這樣,我們就相當於在介面和詳細類之間串連了管道,然後我們就能夠使用詳細類的方法了:IBalance.SelectBalanceInfo(CardID)‘查詢並返回資料集結果

        後來發現。把DAL層裡面的類反射到BLL層裡面。也就相當於在BLL層裡面生產了DAL層的類,然後反射得到詳細類的那些代碼。我便抽象出了一個層,名曰Factory層。僅僅要BLL引用工廠,便能夠通過工廠返回詳細類了。

這也就是反射+工廠的應用吧。

        好像寫的有點長。本來還有重載、設定檔、異常處理、預存程序等比較有用點的技術要寫的。算了,放到下一篇吧。希望對大家有協助。

        雖說物件導向比較複雜。可是整體的感覺,它就是把非常多複雜的東西分類、分塊、分層、分......然後用線把他們竄起來,你不必全然的記住全部的分塊,但你能夠順著那些圖紙毫不保留的瞭解到細節。僅僅要去習慣這種思維方式。相信也不太難的。


 

重構版機房收費系統之分層、介面、資料庫連接、反射+工廠(vb.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.