實現數據訪問功能是大多數使用
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 Studio
NET及其公開的控件所采用
規則使用面向對象的功能 最基礎的面向對象的任務是使用繼承的實現來創建抽象基類
該基類可以包含所有數據訪問類可以通過繼承使用的服務
如果這些服務足夠通用
則可以通過在整個組織中分發基類來對它們進行重用
例如
在最簡單的情況下
基類可以為派生類完成連接對象的創建
如圖
所示
Imports System
Data
SqlClient
Namespace ACME
Data
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 IDisposable
Dispose
_connection
Dispose()
End Sub
End Class
End Namespace
正如您在該圖中看到的那樣
DALBase類被標記為MustInherit(在C#中為abstract)
以確保它用於繼承關系
該類隨後會包含一個在公共構造函數(它接受連接字符串作為參數)中實例化的私有SqlConnection對象
然後
受保護的Connection屬性允許派生類訪問該連接對象
而IDisposable接口中的Dispose方法則確保該連接對象得以被處理
即使是在下面這個簡化的示例中
您也可以從中注意到抽象基類的用處
Public Class WebData : Inherits DALBase
Public Sub New()
MyBase
New(ConfigurationSettings
AppSettings(
ConnectString
))
End Sub
Public Function GetOrders() As DataSet
Dim da As New SqlDataAdapter(
usp_GetOrders
Me
Connection)
da
SelectCommand
CommandType = CommandType
StoredProcedure
Dim ds As New DataSet()
da
Fill(ds)
Return ds
End Function
End Class
在該示例中
WebData類繼承自DALBase
因此它不需要考慮實例化SqlConnection對象的問題
而只需通過MyBase關鍵字(或C#中的base關鍵字)將連接字符串傳遞給基類
WebData類的GetOrders方法可以使用Me
Connection(在C#中為this
Connection)訪問受保護的屬性
盡管該示例相對簡單
但如果您看了規則
和規則
的話
就會發現該基類還可以提供其他服務
當DAL需要在COM+環境中運行時
抽象基類尤其有用
在這種情況下
因為允許組件使用COM+所需的代碼更為復雜
所以創建一個如圖
中所示的服務組件基類是有意義的
<ConstructionEnabled(True)
_
Transaction(TransactionOption
Supported)
_
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類基本上包含了與圖
中相同的功能
但是它另外繼承了System
EnterpriseServices命名空間中的ServicedComponent
並且包含了一些屬性以指明該組件支持對象結構
事務和統計信息跟蹤
然後
該基類負責捕捉在組件服務管理器中配置的結構字符串
並再一次創建和公開SqlConnection對象
需要注意的是
當一個類從DALServicedBase繼承時
它還將繼承屬性的設置
換句話說
派生類也會將它的事務選項設置為Supported
如果該派生類想要重寫該行為
則它可以在類級別重新定義該屬性
此外
派生類還應該在適當位置對自身利用重載方法和共享方法
主要有兩種使用重載方法(具有多個簽名的單個方法)的情況
第一
當方法需要接收改變其類型的參數時
可以使用它們
在Framework中
這一類型的典型示例是System
Convert類的方法
例如
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(Addison
Wesley
)中所介紹的那些設計模式一樣
例如
NET Framework使用了Observer模式的一個名為Event模式的變體(您在類中公開事件時應當遵循該模式)
規則利用基礎結構 NET Framework包含一些可以幫助處理與基礎結構相關的一般性任務(例如
檢測和異常處理)的類和結構
通過基類將這些概念與繼承相結合可能十分有用
例如
請考慮在System
Diagnostics命名空間中公開的跟蹤功能
除了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