熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ADO.NET實現應用程序數據訪問層

2013-11-13 10:12:41  來源: .NET編程 

  實現數據訪問功能是大多數使用NET Framework的開發人員的核心工作並且由他們生成的數據訪問層是其應用程序必不可少的組成部分本文概述了五個建議希望您在使用Visual Studio NET和NET Framework生成數據訪問層時予以考慮這些技巧包括通過使用基類來利用面向對象的技術和NET Framework基礎結構通過遵循某些准則使類變得易於繼承以及在就表示方法和外部接口進行決策之前仔細分析自己的需要
  
  如果您要針對Microsoft NET Framework來開發以數據為中心的應用程序那麼您終將需要創建數據訪問層(DAL)您可能知道在NET Framework中生成代碼帶來的一些好處因為它同時支持實現和接口繼承所以您的代碼可以具有更高的可重用性尤其是可供您的組織中那些使用與Framework兼容的其他編程語言的開發人員重用在本文中我將介紹為了針對基於NET Framework的應用程序而開發DAL的五個規則在開始之前我要說明的是基於本文中討論的規則生成的任何DAL都將與Windows平台上的開發人員所喜愛的傳統的多層或N層應用程序兼容在該體系結構中表示層由對協調數據訪問層工作的業務層進行調用的Web窗體Windows窗體或XML Web Service代碼組成該層包含多個數據訪問類另外在不需要進行業務處理協調的情況下表示層可能會直接對DAL進行調用該體系結構是傳統的模型視圖控制器(MVC)模式的變體並且在許多方面由Visual StudioNET及其公開的控件所采用
  
  規則使用面向對象的功能
  
  最基礎的面向對象的任務是使用繼承的實現來創建抽象基類該基類可以包含所有數據訪問類可以通過繼承使用的服務如果這些服務足夠通用則可以通過在整個組織中分發基類來對它們進行重用例如在最簡單的情況下基類可以為派生類完成連接對象的創建如圖所示
  
  Imports SystemDataSqlClient
  
  Namespace ACMEData
  
  Public MustInherit Class DALBase : Implements IDisposable
  
  Private _connection As SqlConnection
  
  Protected Sub New(ByVal connect As String)
  _connection = New SqlConnection(connect)
  End Sub
  
  Protected ReadOnly Property Connection() As SqlConnection
  Get
  Return _connection
  End Get
  End Property
  
  Public Sub Dispose() Implements IDisposableDispose
  _connectionDispose()
  End Sub
  
  End Class
  
  End Namespace
  
  正如您在該圖中看到的那樣DALBase類被標記為MustInherit(在C#中為abstract)以確保它用於繼承關系該類隨後會包含一個在公共構造函數(它接受連接字符串作為參數)中實例化的私有SqlConnection對象然後受保護的Connection屬性允許派生類訪問該連接對象而IDisposable接口中的Dispose方法則確保該連接對象得以被處理即使是在下面這個簡化的示例中您也可以從中注意到抽象基類的用處
  
  Public Class WebData : Inherits DALBase
  Public Sub New()
  MyBaseNew(ConfigurationSettingsAppSettings(ConnectString))
  End Sub
  
  Public Function GetOrders() As DataSet
  Dim da As New SqlDataAdapter(usp_GetOrders MeConnection)
  daSelectCommandCommandType = CommandTypeStoredProcedure
  Dim ds As New DataSet()
  daFill(ds)
  Return ds
  End Function
  End Class
  
  在該示例中WebData類繼承自DALBase因此它不需要考慮實例化SqlConnection對象的問題而只需通過MyBase關鍵字(或C#中的base關鍵字)將連接字符串傳遞給基類WebData類的GetOrders方法可以使用MeConnection(在C#中為thisConnection)訪問受保護的屬性盡管該示例相對簡單但如果您看了規則和規則的話就會發現該基類還可以提供其他服務
  
  當DAL需要在COM+環境中運行時抽象基類尤其有用在這種情況下因為允許組件使用COM+所需的代碼更為復雜所以創建一個如圖中所示的服務組件基類是有意義的
  
  <ConstructionEnabled(True) _
  Transaction(TransactionOptionSupported) _
  EventTrackingEnabled(True)> _
  Public MustInherit Class DALServicedBase : Inherits ServicedComponent
  
  Private _connection As SqlConnection
  
  Protected Overrides Sub Construct(ByVal s As String)
  _connection = New SqlConnection(s)
  End Sub
  
  Protected ReadOnly Property Connection() As SqlConnection
  Get
  Return _connection
  End Get
  End Property
  
  End Class
  
  在該代碼中DALServicedBase類基本上包含了與圖中相同的功能但是它另外繼承了SystemEnterpriseServices命名空間中的ServicedComponent並且包含了一些屬性以指明該組件支持對象結構事務和統計信息跟蹤然後該基類負責捕捉在組件服務管理器中配置的結構字符串並再一次創建和公開SqlConnection對象需要注意的是當一個類從DALServicedBase繼承時它還將繼承屬性的設置換句話說派生類也會將它的事務選項設置為Supported如果該派生類想要重寫該行為則它可以在類級別重新定義該屬性此外派生類還應該在適當位置對自身利用重載方法和共享方法主要有兩種使用重載方法(具有多個簽名的單個方法)的情況第一當方法需要接收改變其類型的參數時可以使用它們在Framework中這一類型的典型示例是SystemConvert類的方法例如ToString方法包括個接收一個參數的重載方法每個方法都具有不同的類型第二重載方法可以用來公開參數數量不斷增加(但不一定是不同類型的參數)的簽名這種類型的重載證明在DAL中非常有效因為可以使用它來公開用於數據檢索和修改的備用簽名例如可以重載GetOrders方法以便一個簽名不接收任何參數並返回所有訂單而另一個簽名則接收一個表明調用方只打算檢索特定客戶訂單的參數如下面的代碼所示
  
  Public Overloads Function GetOrders() As DataSet
  Public Overloads Function GetOrders(ByVal customerId As Integer) As DataSet
  
  在這種情況下良好的實現技巧是將GetOrders方法的功能抽象到一個可以由每個重載簽名調用的私有或受保護的方法中還可以使用共享方法(在C#中為static方法)來展開可供數據訪問類的所有實例訪問的字段屬性和方法盡管不能將共享成員與使用組件服務的類結合使用但是對於可以在數據訪問類的共享構造函數中檢索然後被所有實例讀取的只讀數據來說它們可能十分有用在對讀/寫數據使用共享成員時要特別小心這是因為多個執行線程可能會競爭使用對共享數據的訪問權
  
  規則遵守設計准則
  
  在Visual Studio NET隨附的聯機文檔中有一個標題為Design Guidelines for Class Library Developers的主題它不僅論述您應該遵循的重載成員構造函數和事件的模式而且還討論了類屬性和方法的命名約定您應該遵守命名約定的主要原因之一是NET Framework提供的交叉語言繼承如果您要在Visual Basic NET中生成一個DAL基類則您需要確保那些使用與NET Framework兼容的其他語言的開發人員可以從它繼承並能容易地理解它的工作方式按照我概述過的准則去做那麼您的命名約定和結構將不會是特定於語言的了舉個例子您會在本文的代碼示例中注意到Camel大小寫風格(首個單詞小寫並夾雜大寫字母)用於方法的參數Pascal大小寫風格(每個單詞都大寫)用於方法而基類則具有Base後綴以表示它是一個抽象類NET Framework設計准則的必然結果是常規設計模式就像Gang of Four撰寫的Design Patterns(AddisonWesley )中所介紹的那些設計模式一樣例如NET Framework使用了Observer模式的一個名為Event模式的變體(您在類中公開事件時應當遵循該模式)
  
  規則利用基礎結構
  
  NET Framework包含一些可以幫助處理與基礎結構相關的一般性任務(例如檢測和異常處理)的類和結構通過基類將這些概念與繼承相結合可能十分有用例如請考慮在SystemDiagnostics命名空間中公開的跟蹤功能除了Trace和Debug類該命名空間還包括從Switch和TraceListener派生的類Switch類—BooleanSwitch和TraceSwitch可以通過編程方式以及通過應用程序的配置文件而被配置為打開和關閉就TraceSwitch而言可以公開多個級別的跟蹤TraceListener類—TextWriterTraceListener和EventLogTraceListener將Trace和Debug方法的輸出分別定向到文本文件和事件日志因此您可以將跟蹤功能添加到基類中以便派生類可以輕松地記錄消息繼而應用程序可以使用應用程序配置文件來控制是否啟用跟蹤您可以通過包含一個BooleanSwitch類型的私有變量並在構造函數中將其實例化以將該功能添加到圖所示的DALBase類中
  
  Public Sub New(ByVal connect As String)
  _connection = New SqlConnection(connect)
  _dalSwitch = New BooleanSwitch(DAL Data Access Code)
  End Sub
  
  BooleanSwitch的參數包括它的名稱和說明您隨後可以添加一個受保護屬性以便將開關打開和關閉並添加另一個受保護屬性以便使用Trace對象的WriteLineIf方法來格式化和寫入跟蹤消息
  
  Protected Property TracingEnabled() As Boolean
  Get
  Ret
From:http://tw.wingwit.com/Article/program/net/201311/12919.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.