數(shù)據(jù)訪問組件
數(shù)據(jù)訪問組件設計文檔描繪與數(shù)據(jù)存儲系統(tǒng)的交互以及與用戶界面的交互的所有細節(jié)。在有些系統(tǒng)中,數(shù)據(jù)訪問組件實際上是處理過程中各種問題的多個程序集。例如,可能會有一系列業(yè)務規(guī)則呈現(xiàn)在與數(shù)據(jù)存儲和檢索完全獨立的用戶界面上。在這種情況下,將業(yè)務組件與數(shù)據(jù)訪問組件分開實現(xiàn)可能比較明智。
在我們的示例中,實際實現(xiàn)的是兩個單獨的組件:Message 組件和 DataAccess 組件。如果在支持基于 XML 的數(shù)據(jù)的傳輸服務(例如 SOAP Web Service)中進行規(guī)劃,這種面向消息的實現(xiàn)方案將會特別有成效。
消息組件
消息組件定義一系列用于在各圖層之間傳輸數(shù)據(jù)的類。這些消息可以作為二進制或 XML 文本數(shù)據(jù)存在。消息圖層的價值在于:保護系統(tǒng)的其余部分,使其獨立于數(shù)據(jù)存儲實現(xiàn)方案的具體細節(jié),例如 SQL Server、XML 文件等。此外,通過實現(xiàn)消息圖層而不是更復雜的“智能對象”庫,我們的解決方案可以更輕松地支持那些不能同時發(fā)送數(shù)據(jù)和類級別邏輯的遠程調用服務,例如 XML-SOAP。
下面是一個消息類示例,在該示例中實現(xiàn)了 Topic 消息及其集合:
Public Class Topic
Private _ID As Integer
Private _Title As String
Private _Description As String
Public Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal Value As Integer)
_ID = Value
End Set
End Property
Public Property Title() As String
Get
Return _Title
End Get
Set(ByVal Value As String)
_Title = Value
End Set
End Property
Public Property Description() As String
Get
Return _Description
End Get
Set(ByVal Value As String)
_Description = Value
End Set
End Property
End Class
Public Class Topics
Inherits System.Collections.CollectionBase
Default Public Property Item(ByVal index As Integer) As Topic
Get
Return CType(List(index), Topic)
End Get
Set(ByVal Value As Topic)
List(index) = Value
End Set
End Property
Public Function Add(ByVal s As Topic) As Integer
Return List.Add(s)
End Function
Public Sub Remove(ByVal index As Integer)
List.Remove(index)
End Sub
End Class
注意:如果您已嘗試過面向消息的設計,便會了解我們想要使這些消息類系列化,以便在應用程序圖層之間輕松地來回發(fā)送。幸運的是,.NET 運行時知道如何進行這項操作,而無需我們做過多的工作。但是,當我們學習創(chuàng)建消息的文章時,我們將詳細討論 .NET 運行時如何系列化類,以及我們如何進行操作以使代碼中的過程最優(yōu)化。
在后面實現(xiàn)消息組件和數(shù)據(jù)訪問組件時,文章中將介紹此方法的細節(jié)。設計文檔將包含一個由所有信息及其屬性與數(shù)據(jù)類型組成的列表?,F(xiàn)在,我們只是考慮如何使用此消息方法來封裝圖層間的數(shù)據(jù)傳輸,如何創(chuàng)建一種與本地方案和遠程方案配合使用的常規(guī)數(shù)據(jù)服務。
數(shù)據(jù)訪問組件
定義消息類的概念后,數(shù)據(jù)訪問組件可以集中精力處理與數(shù)據(jù)存儲系統(tǒng)直接對話的細節(jié),并以正確的消息格式返回信息。在我們的示例中,這將涉及到使用來自用戶界面的請求映射 SQL Server 存儲過程,并創(chuàng)建可返回到用戶界面進行顯示的消息(或消息集合)。
例如,下面是一個數(shù)據(jù)訪問組件的一部分示例代碼,該組件將從數(shù)據(jù)存儲中檢索單個 Topic 記錄,并將正確的消息格式返回到用戶界面。
Public Function GetTopicRecord(ByVal ID As Integer) As Messages.Topic
Dim t As Messages.Topic = New Messages.Topic
cn = New SqlConnection(secureConnectionString)
cd = New SqlCommand("GetTopic", cn)
cd.CommandType = CommandType.StoredProcedure
cd.Parameters.Add("@ID", ID)
cn.Open()
dr = cd.ExecuteReader()
dr.Read()
With t
.ID = ID
.Title = dr("Title")
.Description = dr("Description")
End With
Return t
End Function
設計文檔將包括一系列用于處理來自用戶界面的各個請求的類和方法,并含有有關調用哪個存儲過程以及返回何種消息格式的詳細信息。同樣,我們將在后面主要介紹數(shù)據(jù)訪問圖層的文章中討論此過程的細節(jié)。
Web 用戶界面
最后,用戶界面設計文檔將包括完成各種方案所需的所有用戶輸入和顯示。通常來說,用戶界面文檔包括界面機制的細節(jié)以及使用戶界面呈現(xiàn)唯一性的圖形設計元素。例如,配色方案、字體和總體頁面設計,與用于獲取搜索查詢的正確數(shù)據(jù)的輸入名稱和輸入數(shù)量一樣重要。
要使文檔簡潔,通常在一個與圖形設計單獨的文檔中概要描述機制細節(jié)。這是我們將要在示例中做的工作。在后面的一篇文章中,我們將創(chuàng)建一個綜合性用戶界面文檔和實現(xiàn)方案,詳細說明每個屏幕的元素和相關操作。在另一篇文章中,我們將處理應用程序有關圖形的各個方面,重點討論作為一種外觀服務的級聯(lián)樣式表的使用。
下面是一個典型的用戶界面描述,它涉及“主題”編輯方案。
主題輸入屏幕
“主題”屏幕將顯示所有當前主題(主題 ID 和主題名稱)的一個縮略列表,在每個主題旁邊還將顯示一個“編輯”鏈接。單擊“編輯”鏈接將會調用關聯(lián)的主題記錄并將其顯示在一系列的輸入框中?!皹祟}”和“描述”是可編輯的,而“主題 ID”是只讀的。用戶可以編輯標題和描述,然后按“保存”按鈕將更改寫入數(shù)據(jù)存儲。輸入將被驗證。兩者都是必需的輸入項,“標題”的長度限制為 30 個字符,“描述”的長度限制為 500 個字符。更新完成后,將顯示一條響應消息指出已確認更新;如果更新失敗,則顯示一條消息指出錯誤狀況。
用戶還可以刪除現(xiàn)有的主題記錄,方法是單擊列表中的“編輯”鏈接,審核顯示屏幕上的記錄細節(jié)后,單擊“刪除”鏈接。刪除完成后,將顯示一條響應消息指出已確認更新;如果更新失敗,則顯示一條消息指出錯誤狀況。請注意,用戶不能刪除與現(xiàn)有問題或回答相關聯(lián)的主題。
此外,用戶可以完整地添加新主題記錄,方法是在初始顯示屏幕上單擊“新建主題”鏈接。將顯示“標題”和“描述”輸入(不顯示 ID 輸入)并提供一個“保存”按鈕。輸入將被驗證。兩者都是必需的輸入項,“標題”的長度限制為 30 個字符,“描述”的長度限制為 500 個字符。更新完成后,將顯示一條響應消息指出已確認更新;如果更新失敗,則顯示一條消息指出錯誤狀況。
利用上面的敘述,您可以輕松地實現(xiàn)一個完整的功能屏幕。判斷一個好的設計文檔的方法是:它能夠使讀者完成工作,且不會提出額外的問題。最終的用戶界面設計文檔將包括應用程序中每個屏幕的此類敘述。
小結并付諸行動
我們簡要介紹了數(shù)據(jù)庫、中間層和用戶界面實現(xiàn)方案的最終設計文檔。加上體系結構和初始規(guī)劃文檔,它們形成了我們的完整設計包。在實際的情況中,即使是最小的系統(tǒng),完成這些文檔也至少需要幾個小時。對于大型系統(tǒng),可能需要幾周甚至可能幾個月的時間。有些人可能會對此有一點挫敗感,但是通過事先完成這些工作,您可以在進入項目的編碼階段之前很早就了解完成解決方案面臨的幾乎所有主要障礙。這樣可以減少編寫實際代碼的時間,并且還可以減少您會遇到的錯誤和障礙的數(shù)量。