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