本文僅代表作者個人觀點,正確與否請讀者自行研究!
原文地址:http://www.microsoft.com/china/msdn/library/dnaspp/html/aspnet-jumpinto-part1.asp
摘要:了解如何規(guī)劃和設(shè)計 ASP.NET 應(yīng)用程序。本文以一個知識庫 Web 應(yīng)用程序為例,討論實際應(yīng)用程序創(chuàng)建實踐中最常見的幾個因素。(本文包含一些指向英文站點的鏈接。)
目錄
簡介 規(guī)劃基本 ASP.NET 應(yīng)用程序 定義應(yīng)用程序體系結(jié)構(gòu) 安全規(guī)劃 完成設(shè)計文檔 小結(jié)并付諸行動 簡介
歡迎來到“進(jìn)入 ASP.NET 世界”。在隨后的幾周或幾個月中,本系列文章將逐步詳細(xì)介紹如何使用 Microsoft® ASP.NET 和 Microsoft Visual Studio® .NET 來設(shè)計、實現(xiàn)和部署典型的 Web 應(yīng)用程序,以探討實際應(yīng)用程序創(chuàng)建實踐中最常見的幾個因素。我們不僅僅布置一些 Web 窗體,也不局限于只對后端數(shù)據(jù)庫進(jìn)行一些數(shù)據(jù)綁定。數(shù)據(jù)綁定和 Web 窗體布局很重要,但是有許多其他問題也非常重要。
例如,無論采用何種目標(biāo)平臺或語言,所有經(jīng)過良好編碼的項目都包括一些基本的規(guī)劃步驟,例如目標(biāo)聲明、用戶方案文檔,甚至用于標(biāo)識解決方案的物理邊界和邏輯邊界的體系結(jié)構(gòu)文檔。此外,在解決方案生命周期的早期就將安全規(guī)劃包含在內(nèi)是一種非常好的習(xí)慣。這些內(nèi)容與良好的數(shù)據(jù)庫模型、精心設(shè)計的中間件組件以及簡潔的用戶界面設(shè)計一起,可以確保您最終在生產(chǎn)中部署的應(yīng)用程序是安全的、可靠的,并且是用戶友好的。
此時,一些讀者可能會認(rèn)為本文屬于那些基調(diào)很高的文章,目標(biāo)定位在某些超大型企業(yè)級方案,而這種方案根本不適用于一般的小工廠、愛好者或個人開發(fā)團(tuán)體。其實并不是這樣!即使只是創(chuàng)建您自己個人使用的基于 Web 的小型解決方案,從一開始就進(jìn)行完善的規(guī)劃將有助于確保流程最終的輕松實現(xiàn)和部署。而且,并不是高級的程序員或 Web 開發(fā)人員才可以使用這些技術(shù)。無論您的技術(shù)水平如何,也無論您屬于哪類目標(biāo)讀者,我相信您都會發(fā)現(xiàn)這一系列文章對您很有幫助,它為您提供了豐富的信息,而且(請允許我這樣說)十分有趣。
我們將生成一個稱為 DotNetKB 的示例知識庫 Web 應(yīng)用程序,這個過程將貫穿整個系列文章。在作為第一篇文章的本文中,我們將介紹典型項目的設(shè)計階段,包括基本規(guī)劃、應(yīng)用程序體系結(jié)構(gòu)和實現(xiàn)方案設(shè)計。學(xué)習(xí)完本文后,您將已經(jīng)準(zhǔn)備好所有的文檔,并會迫不及待地希望開始創(chuàng)建解決方案。
預(yù)備工作非常簡單,我們跳過這部分內(nèi)容,直接開始第一步“應(yīng)用程序規(guī)劃”。 規(guī)劃基本 ASP.NET 應(yīng)用程序
使用 Visual Studio .NET 創(chuàng)建基于 Web 的 ASP.NET 應(yīng)用程序的第一步是制定基本的應(yīng)用程序規(guī)劃 (AP)。制定規(guī)劃不僅對于由多個開發(fā)人員建立的大型解決方案而言是必不可少的,而且即使對于最小的應(yīng)用程序,一個完善的 AP 也是非常重要的。創(chuàng)建 AP 有助于您在開始編碼“之前”就能仔細(xì)考慮一些常見問題。這樣,您可以在應(yīng)用程序生命周期的早期便完全了解挑戰(zhàn)和解決方案,而不是在完全陷入窘境之后才發(fā)現(xiàn)問題。在《Software Project Survival Guide》一書中,作者 Steve McConnell 指出:在軟件項目后期糾正錯誤所花的成本與在早期階段發(fā)現(xiàn)并糾正這些錯誤所花的成本相比,前者可能是后者的 50 - 200 倍。
一個完善的項目規(guī)劃包含哪些內(nèi)容?可以包含許多內(nèi)容,但最基本的是要包含目標(biāo)聲明和一系列用戶方案。還有其他很多有用的資料,包括需求文檔、編碼標(biāo)準(zhǔn)、交付進(jìn)度、測試過程等。對于我們要建立的簡單示例解決方案,將主要介紹簡單的應(yīng)用程序聲明和一些用戶方案。同時還將解決一些其他問題。
應(yīng)用程序聲明
此系列文章要建立的項目(稱為 DotNetKB)是一個簡單的知識庫 Web 站點,在這個站點中,用戶可以提各種問題,并可以得到授權(quán)“專家”的回答。這樣,以后訪問者在查找常見 ASP.NET 問題的解決方案時,可以對得到的結(jié)果數(shù)據(jù)進(jìn)行搜索和過濾。
這是對我們的 DotNetKB 項目的一個基本目標(biāo)聲明。DotNetKB 是一個基于 Web 的應(yīng)用程序,它可以列出訪問者提出的一系列問題,并顯示授權(quán)專家對這些問題作出的回復(fù)。訪問者可以向系統(tǒng)添加新問題,并可以按照問題的主題、問題和/或回答中的關(guān)鍵字來搜索和過濾這些問題。訪問者還可以按主題或按添加到系統(tǒng)中的日期來對問題列表進(jìn)行排序。
授權(quán)專家可以登錄到應(yīng)用程序中已設(shè)置安全機制的部分,審閱問題,添加、編輯和刪除對一個問題的一個或多個回答。應(yīng)用程序管理員還可以建立專家登錄權(quán)限和登錄配置文件,以及添加、編輯和刪除問題主題。
此外,還提供了一些基本統(tǒng)計信息,包括系統(tǒng)中問題和回答的數(shù)量,以及每個專家的回復(fù)數(shù)量和至今已被訪問的頁面數(shù)量。
正如您從上面的聲明中看到的那樣,該解決方案非常簡單。在閱讀目標(biāo)聲明時,您可能會開始考慮可以添加到這個應(yīng)用程序的許多其他功能,以使應(yīng)用程序更加強大。這說明了項目目標(biāo)聲明的一個主要依據(jù),即避免“功能蔓延”。我們都清楚,如果更改最終結(jié)果本來基于的概念,簡單的想法將導(dǎo)致非常龐大且歪曲的結(jié)果。有句老格言:“如果不知道要去往何方,你可能會在某個地方停下來”,它原本揭示的是夏季公路旅行,其道理同樣可用于軟件項目。
一些項目的目標(biāo)聲明中可能需要包含更多的信息。而對于我們的使用,上面的目標(biāo)聲明就符合要求,F(xiàn)在我們對于要完成的應(yīng)用程序有了一個清晰的認(rèn)識,接下來需要一些詳細(xì)的信息來描述用戶如何與系統(tǒng)交互以及用戶需要執(zhí)行哪些任務(wù)來完成目標(biāo)。我們需要一系列用戶方案。
文檔化用戶方案
用戶方案沒有什么令人驚異之處。通常,它們只是描述用戶如何與應(yīng)用程序交互。用戶方案的關(guān)鍵價值在于記錄了關(guān)于每個人對用戶希望系統(tǒng)如何運行以及應(yīng)用程序應(yīng)如何響應(yīng)的設(shè)想。通過完成這個過程,您將可以完全了解處理各種用戶與系統(tǒng)的交互時所需的數(shù)據(jù)點和函數(shù)。換句話說,編寫完善的用戶方案將有助于您確定完成解決方案需要實現(xiàn)的數(shù)據(jù)庫、中間件和用戶界面元素。
注意:Visual Studio .NET Enterprise Architect 有一項非常不錯的功能,即允許您使用 Microsoft Visio® 通過 UML(統(tǒng)一建模語言)創(chuàng)建用戶方案,然后生成這些方案的基本代碼。在這里,我不打算深入探討這些細(xì)節(jié),但是您可以在 MSDN® Academic Alliance 站點找到一篇關(guān)于這一主題的好文章 Generating .NET Code Using Visio Enterprise Architect's UML,作者是 Sreedhar Koganti。
有了上一節(jié)的目標(biāo)聲明后,下面是 DotNetKB 項目的幾個示例用戶方案。
搜索知識庫
匿名用戶可以輸入一個或多個關(guān)鍵字并執(zhí)行搜索,搜索將返回包含這些關(guān)鍵字的問題和/或回答列表。用戶可以將關(guān)鍵字搜索鎖定在僅搜索問題、僅搜索回答或者二者都搜索。返回的列表將顯示問題及其回復(fù)數(shù)和被其他用戶訪問的次數(shù)。單擊鏈接將返回以時間先后逆序排列的回復(fù)(純文本)列表。
將新問題輸入到知識庫中
匿名用戶可以瀏覽用于向數(shù)據(jù)庫輸入新問題以供授權(quán)專家審閱和回復(fù)的屏幕。用戶可以輸入問題的標(biāo)題和內(nèi)容,并可以選擇在一系列主題中的某個主題下記錄該問題。用戶還可以輸入他們的名字和相關(guān)的 URL(電子郵件、Web 地址等)。輸入將被驗證,以確保包含必需的數(shù)據(jù)并確保所有輸入數(shù)據(jù)不會受到腳本攻擊等。一旦數(shù)據(jù)經(jīng)過驗證并被保存到數(shù)據(jù)庫中,用戶將看到一個響應(yīng)屏幕,感謝用戶的支持并將用戶直接連接到主頁。此外,用戶還可以選擇讓該站點“記住”他們的姓名和 URL 以備以后訪問該站點時使用。
您已經(jīng)了解它的工作原理了,對嗎?每一個方案都嘗試細(xì)化用戶交互的重要方面。例如,上面列出的兩個方案表明用戶為“anonymous”(匿名用戶),這表示這類用戶不需要登錄或進(jìn)行其他方式的授權(quán)。第二個示例還標(biāo)識了若干輸入值、驗證步驟和可選操作。
當(dāng)然,這只是兩個示例;完整的系統(tǒng)需要更多的方案。此外,需要特別注意的是,“用戶”不僅僅可以是人,也可以是您的程序需要與其通信的其他應(yīng)用程序,甚至還可以是您的應(yīng)用程序的其他部分。例如,一個方案描述主頁如何列出最近添加到知識庫中的內(nèi)容,以供任何人查看。此例中的“用戶”將是主頁自身。還有一些方案描述專家如何查找和回復(fù)新問題以及管理員如何更新主題列表并管理系統(tǒng)的其他部分。我已為討論這個簡單的應(yīng)用程序標(biāo)識了 20 多種方案。您可以在 DotNetKB 中找到當(dāng)前列表(以及與此項目相關(guān)的所有其他資料)。
至此我們就有了目標(biāo)聲明和一些用戶方案,F(xiàn)在,是時候稍憩一下,然后學(xué)學(xué)一些技術(shù)了。我們需要定義應(yīng)用程序體系結(jié)構(gòu),這可以幫助我們以“鮮活有效的代碼”實際實現(xiàn)方案。 定義應(yīng)用程序體系結(jié)構(gòu)
有了基本的目的和為解決方案開發(fā)的用戶方案列表后,您需要開始籌劃整體的體系結(jié)構(gòu)。主要目標(biāo)是標(biāo)識應(yīng)用程序的邏輯方面和物理方面,即如何將應(yīng)用程序拆分為各種有用的部分。在本節(jié)中還添加了安全性方面的內(nèi)容。安全是在規(guī)劃的“一開始”您就需要考慮的問題,而不是在開發(fā)周期中“最后添加”的內(nèi)容。我們稍后會在本節(jié)中詳細(xì)討論這個問題。
邏輯體系結(jié)構(gòu)
從邏輯上講,您需要規(guī)劃解決方案以標(biāo)識數(shù)據(jù)存儲、數(shù)據(jù)訪問、業(yè)務(wù)規(guī)則、用戶界面等之間的“邊界”。通常,Web 開發(fā)人員會選擇一個兩階段模型,并用 Web 窗體存儲用于訪問現(xiàn)有數(shù)據(jù)存儲系統(tǒng)(例如 Microsoft SQL Server)的所有代碼。一個更有效的方法是創(chuàng)建一個位于 Web 窗體用戶界面與 SQL Server 數(shù)據(jù)存儲系統(tǒng)之間的中間層組件庫。這種三層方法(Web 窗體、組件、數(shù)據(jù)庫)通常是大多數(shù)應(yīng)用程序所需的。但是,在某些情況下,可能需要一個其他層來處理服務(wù)器之間傳輸?shù)臄?shù)據(jù)。這個傳輸層可以使用獨立于平臺的協(xié)議(例如 XML-SOAP)來實現(xiàn)。但是,如果您從頭到尾都使用 Microsoft .NET 技術(shù),則可以使用 .NET 遠(yuǎn)程協(xié)議的二進(jìn)制版來完成這一任務(wù),而且速度比使用 XML-SOAP 要快得多。
對于我們的示例,我們將定義三個邏輯邊界:用戶界面(Web 窗體)、中間層(一個 .NET 組件程序集)和數(shù)據(jù)層(SQL Server 數(shù)據(jù)庫)。圖 1 顯示了如何表示這一內(nèi)容。
圖 1:三層圖
現(xiàn)在我們有一個簡單的邏輯模型。它是如何起作用的?它有助于我們考慮各個邏輯組之間的邊界。每個邏輯層應(yīng)盡量與其他層獨立。理想的情況是,圖層中的更改應(yīng)該對整體產(chǎn)生最小的影響。例如,如果將數(shù)據(jù)存儲從 SQL Server 更改到 XML 數(shù)據(jù)文件,唯一受到影響的圖層應(yīng)是中間層圖層。用戶界面應(yīng)該根本無需考慮更改。這會使您進(jìn)行思考:如何實現(xiàn)解決方案的實際編碼以實現(xiàn)此原則。
另外,邏輯層有助于我們考慮安全問題。各個圖層之間的邊界都存在潛在的安全漏洞。而且,各個圖層可能有自己特定的安全措施(SQL Server 權(quán)限、.NET 運行時權(quán)限、ASP.NET 安全等)。同樣,我們稍后會在本節(jié)中詳細(xì)討論這個問題。
物理體系結(jié)構(gòu)
確定邏輯層后,考慮物理層也很重要。例如,您可以在同時安裝有 SQL Server、Internet Information Server、ASP.NET 和 .NET 運行時的單個實際計算機上實現(xiàn)這個應(yīng)用程序。這將是一個物理層。但更可靠且可擴(kuò)展的方法是:在由三個 Web 服務(wù)器組成的簇上部署 Web 窗體,在兩個應(yīng)用服務(wù)器上部署 .NET 組件程序集,在兩個故障恢復(fù)模式的 SQL Server 上部署數(shù)據(jù)庫。這樣產(chǎn)生的物理體系結(jié)構(gòu)將七個 Windows 服務(wù)器包含在三個主要組中:Web 簇、組件簇和數(shù)據(jù)庫簇。如果您了解系統(tǒng)的不同邏輯部件可以位于不同的計算機上,您可能會實現(xiàn)不同的代碼。
對于我們的示例,我們采用一個有效且強大的兩層模型:Web 服務(wù)器托管用戶界面和組件,數(shù)據(jù)庫服務(wù)器托管 SQL Server 數(shù)據(jù)存儲。如果通信量非常大,這個模型使我們可以靈活地在簇中添加更多的服務(wù)器,并使其保持足夠的簡潔以便于處理。下面的圖像顯示了此物理體系結(jié)構(gòu)與前面定義的邏輯體系結(jié)構(gòu)之間的映射關(guān)系。
圖 2:物理體系結(jié)構(gòu)與三層體系結(jié)構(gòu)之間的映射關(guān)系
正如您看到的那樣,邏輯體系結(jié)構(gòu)和物理體系結(jié)構(gòu)不必相同。在規(guī)劃階段還要考慮一項內(nèi)容:安全。 安全規(guī)劃
Microsoft 有一個關(guān)于安全性與軟件這一主題的歌訣:“Secure by design, secure by default, and secure by deployment(設(shè)計安全,默認(rèn)安全和部署安全)”。即,在安全中設(shè)計,期待系統(tǒng)在默認(rèn)情況下是安全的,以及創(chuàng)建可以在安全環(huán)境中成功部署的解決方案。安全始終是重要的。既然越來越多的軟件要在公用的 Internet 上“生存”,編寫安全的軟件就更加關(guān)鍵。對于我們而言,幸運的是,.NET 運行時和 Windows 操作系統(tǒng)提供廣泛的安全選項和功能,我們可以輕松地將其包含在我們的應(yīng)用程序中。無需過分注重標(biāo)識和消除聯(lián)機解決方案中安全漏洞的細(xì)節(jié),我們可以指出其中一些最常見的漏洞并指出我們的應(yīng)用程序規(guī)劃如何進(jìn)行處理。
注意:有關(guān)可用選項的詳細(xì)信息,請參閱 Microsoft Security Developer Center。
緩沖區(qū)溢出
這可能是已編譯應(yīng)用程序中最常見的安全漏洞。由于我們將使用 .NET 運行時,而它是設(shè)計用來在內(nèi)存中安全運行的,因此不太可能發(fā)生緩沖區(qū)溢出。此外,我們使用 Microsoft Visual Basic® .NET 對解決方案進(jìn)行編碼,而 Microsoft Visual Basic® .NET 不像 C 或 C++ 那樣容易受到緩沖區(qū)溢出問題的影響。但是,即使我們打算用 C++ 創(chuàng)建組件,我們還可以使用編譯程序的特殊功能,GS 轉(zhuǎn)換,來保護(hù)我們免受大多數(shù)緩沖區(qū)溢出的攻擊。
數(shù)據(jù)庫攻擊
另一種常見的安全漏洞可能會使惡意用戶獲得訪問存儲在數(shù)據(jù)庫中的原始數(shù)據(jù)的權(quán)限。為了防止黑客獲得數(shù)據(jù)的控制權(quán),我們僅使用 SQL Server 存儲過程,而不使用“內(nèi)聯(lián)查詢”。這樣可以大大減少試圖在輸入流中插入其他 SQL 命令的攻擊。我們還在程序中多個位置處使用輸入驗證,以確保所有輸入僅包含有效的字符。
交叉站點腳本攻擊
對 Web 應(yīng)用程序進(jìn)行的常見攻擊還有一種,它涉及到用戶在輸入流中添加客戶方腳本,這類攻擊將執(zhí)行附加的對話并誘騙用戶將個人數(shù)據(jù)發(fā)送到黑客自己的 Web 站點。要解決這個問題,我們使用 ASP.NET 1.1 的一個新功能,過濾出這種惡意代碼的所有輸入,防止將它置入系統(tǒng)中。顯示屏幕上還包含附加代碼,它將自動禁用任何腳本或顯示可能會插入到數(shù)據(jù)存儲中的標(biāo)記。
至此,我們已獲得了應(yīng)用程序的邏輯模型和物理模型,以及確保實現(xiàn)方案包含的安全功能清單。擁有了這些以及目標(biāo)聲明和用戶方案,我們可以開始這次“編碼前”探險的最后一部分了。 完成設(shè)計文檔
在直接進(jìn)入項目的編碼部分之前,需要花一點時間實際勾畫出應(yīng)用程序的邏輯組件,這非常重要。在我們的示例解決方案中,我們要實現(xiàn)解決方案的三個邏輯組件:數(shù)據(jù)庫、.NET 數(shù)據(jù)訪問組件和 ASP.NET 用戶界面。在下面幾篇文章中,我們將非常詳細(xì)地介紹如何實現(xiàn)這些組件。但現(xiàn)在,我們只是勾畫出每個組件的大致輪廓,討論過程中最重要的方面,即文檔化組件間的交互。
數(shù)據(jù)庫
對于 DotNetKB 應(yīng)用程序,我們需要將數(shù)據(jù)存儲在三張表中:主題、問題和回答(請參閱下圖)。
圖 3:主題、問題和回答表
我們需要使用存儲過程,以使中間層組件也可以安全地訪問數(shù)據(jù)。有關(guān)數(shù)據(jù)庫的細(xì)節(jié),我們將在下一篇文章中討論。這里,我們只是指出:列出表名稱及所有列細(xì)節(jié)、默認(rèn)索引和存儲過程列表的數(shù)據(jù)庫文檔,應(yīng)該包含在一個完整的數(shù)據(jù)庫設(shè)計文檔中。即,文檔中應(yīng)該具有成功實現(xiàn)系統(tǒng)數(shù)據(jù)存儲部分所需的詳細(xì)信息。
注意:如果留心的話,您可能會注意到我們未提及將專家數(shù)據(jù)存儲在數(shù)據(jù)庫中。只是為了使項目更加有趣(同時給我們一個機會使用直接 XML 數(shù)據(jù)存儲),我們將專家信息存儲在一個 XML 數(shù)據(jù)文件中。
數(shù)據(jù)訪問組件
數(shù)據(jù)訪問組件設(shè)計文檔描繪與數(shù)據(jù)存儲系統(tǒng)的交互以及與用戶界面的交互的所有細(xì)節(jié)。在有些系統(tǒng)中,數(shù)據(jù)訪問組件實際上是處理過程中各種問題的多個程序集。例如,可能會有一系列業(yè)務(wù)規(guī)則呈現(xiàn)在與數(shù)據(jù)存儲和檢索完全獨立的用戶界面上。在這種情況下,將業(yè)務(wù)組件與數(shù)據(jù)訪問組件分開實現(xiàn)可能比較明智。
在我們的示例中,實際實現(xiàn)的是兩個單獨的組件:Message 組件和 DataAccess 組件。如果在支持基于 XML 的數(shù)據(jù)的傳輸服務(wù)(例如 SOAP Web Service)中進(jìn)行規(guī)劃,這種面向消息的實現(xiàn)方案將會特別有成效。
消息組件
消息組件定義一系列用于在各圖層之間傳輸數(shù)據(jù)的類。這些消息可以作為二進(jìn)制或 XML 文本數(shù)據(jù)存在。消息圖層的價值在于:保護(hù)系統(tǒng)的其余部分,使其獨立于數(shù)據(jù)存儲實現(xiàn)方案的具體細(xì)節(jié),例如 SQL Server、XML 文件等。此外,通過實現(xiàn)消息圖層而不是更復(fù)雜的“智能對象”庫,我們的解決方案可以更輕松地支持那些不能同時發(fā)送數(shù)據(jù)和類級別邏輯的遠(yuǎn)程調(diào)用服務(wù),例如 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
注意:如果您已嘗試過面向消息的設(shè)計,便會了解我們想要使這些消息類系列化,以便在應(yīng)用程序圖層之間輕松地來回發(fā)送。幸運的是,.NET 運行時知道如何進(jìn)行這項操作,而無需我們做過多的工作。但是,當(dāng)我們學(xué)習(xí)創(chuàng)建消息的文章時,我們將詳細(xì)討論 .NET 運行時如何系列化類,以及我們?nèi)绾芜M(jìn)行操作以使代碼中的過程最優(yōu)化。
在后面實現(xiàn)消息組件和數(shù)據(jù)訪問組件時,文章中將介紹此方法的細(xì)節(jié)。設(shè)計文檔將包含一個由所有信息及其屬性與數(shù)據(jù)類型組成的列表,F(xiàn)在,我們只是考慮如何使用此消息方法來封裝圖層間的數(shù)據(jù)傳輸,如何創(chuàng)建一種與本地方案和遠(yuǎn)程方案配合使用的常規(guī)數(shù)據(jù)服務(wù)。
數(shù)據(jù)訪問組件
定義消息類的概念后,數(shù)據(jù)訪問組件可以集中精力處理與數(shù)據(jù)存儲系統(tǒng)直接對話的細(xì)節(jié),并以正確的消息格式返回信息。在我們的示例中,這將涉及到使用來自用戶界面的請求映射 SQL Server 存儲過程,并創(chuàng)建可返回到用戶界面進(jìn)行顯示的消息(或消息集合)。
例如,下面是一個數(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è)計文檔將包括一系列用于處理來自用戶界面的各個請求的類和方法,并含有有關(guān)調(diào)用哪個存儲過程以及返回何種消息格式的詳細(xì)信息。同樣,我們將在后面主要介紹數(shù)據(jù)訪問圖層的文章中討論此過程的細(xì)節(jié)。
Web 用戶界面
最后,用戶界面設(shè)計文檔將包括完成各種方案所需的所有用戶輸入和顯示。通常來說,用戶界面文檔包括界面機制的細(xì)節(jié)以及使用戶界面呈現(xiàn)唯一性的圖形設(shè)計元素。例如,配色方案、字體和總體頁面設(shè)計,與用于獲取搜索查詢的正確數(shù)據(jù)的輸入名稱和輸入數(shù)量一樣重要。
要使文檔簡潔,通常在一個與圖形設(shè)計單獨的文檔中概要描述機制細(xì)節(jié)。這是我們將要在示例中做的工作。在后面的一篇文章中,我們將創(chuàng)建一個綜合性用戶界面文檔和實現(xiàn)方案,詳細(xì)說明每個屏幕的元素和相關(guān)操作。在另一篇文章中,我們將處理應(yīng)用程序有關(guān)圖形的各個方面,重點討論作為一種外觀服務(wù)的級聯(lián)樣式表的使用。
下面是一個典型的用戶界面描述,它涉及“主題”編輯方案。
主題輸入屏幕
“主題”屏幕將顯示所有當(dāng)前主題(主題 ID 和主題名稱)的一個縮略列表,在每個主題旁邊還將顯示一個“編輯”鏈接。單擊“編輯”鏈接將會調(diào)用關(guān)聯(lián)的主題記錄并將其顯示在一系列的輸入框中!皹(biāo)題”和“描述”是可編輯的,而“主題 ID”是只讀的。用戶可以編輯標(biāo)題和描述,然后按“保存”按鈕將更改寫入數(shù)據(jù)存儲。輸入將被驗證。兩者都是必需的輸入項,“標(biāo)題”的長度限制為 30 個字符,“描述”的長度限制為 500 個字符。更新完成后,將顯示一條響應(yīng)消息指出已確認(rèn)更新;如果更新失敗,則顯示一條消息指出錯誤狀況。
用戶還可以刪除現(xiàn)有的主題記錄,方法是單擊列表中的“編輯”鏈接,審核顯示屏幕上的記錄細(xì)節(jié)后,單擊“刪除”鏈接。刪除完成后,將顯示一條響應(yīng)消息指出已確認(rèn)更新;如果更新失敗,則顯示一條消息指出錯誤狀況。請注意,用戶不能刪除與現(xiàn)有問題或回答相關(guān)聯(lián)的主題。
此外,用戶可以完整地添加新主題記錄,方法是在初始顯示屏幕上單擊“新建主題”鏈接。將顯示“標(biāo)題”和“描述”輸入(不顯示 ID 輸入)并提供一個“保存”按鈕。輸入將被驗證。兩者都是必需的輸入項,“標(biāo)題”的長度限制為 30 個字符,“描述”的長度限制為 500 個字符。更新完成后,將顯示一條響應(yīng)消息指出已確認(rèn)更新;如果更新失敗,則顯示一條消息指出錯誤狀況。
利用上面的敘述,您可以輕松地實現(xiàn)一個完整的功能屏幕。判斷一個好的設(shè)計文檔的方法是:它能夠使讀者完成工作,且不會提出額外的問題。最終的用戶界面設(shè)計文檔將包括應(yīng)用程序中每個屏幕的此類敘述。 小結(jié)并付諸行動
我們簡要介紹了數(shù)據(jù)庫、中間層和用戶界面實現(xiàn)方案的最終設(shè)計文檔。加上體系結(jié)構(gòu)和初始規(guī)劃文檔,它們形成了我們的完整設(shè)計包。在實際的情況中,即使是最小的系統(tǒng),完成這些文檔也至少需要幾個小時。對于大型系統(tǒng),可能需要幾周甚至可能幾個月的時間。有些人可能會對此有一點挫敗感,但是通過事先完成這些工作,您可以在進(jìn)入項目的編碼階段之前很早就了解完成解決方案面臨的幾乎所有主要障礙。這樣可以減少編寫實際代碼的時間,并且還可以減少您會遇到的錯誤和障礙的數(shù)量。
在下一篇文章中,我們將討論使用 Visual Studio .NET 在 SQL Server 中建立數(shù)據(jù)存儲系統(tǒng)的有關(guān)細(xì)節(jié)。我們將定義數(shù)據(jù)表,創(chuàng)建必需的存儲過程,并設(shè)置正確的數(shù)據(jù)訪問,以確保任何組件和數(shù)據(jù)本身之間具有安全可靠的連接。
至此,您已經(jīng)看到了一個如何創(chuàng)建應(yīng)用程序規(guī)劃的可用示例,可以開始考慮如何在您自己的工作中使用這些元素來提高項目的整體質(zhì)量和生產(chǎn)率。有關(guān)項目規(guī)劃以及規(guī)劃如何影響軟件質(zhì)量的詳細(xì)信息,請參閱 Steve McConnell 的 Software Project Survival Guide。
Mike Amundsen 提供培訓(xùn)、演講和咨詢服務(wù)。要了解他的詳細(xì)信息或與他聯(lián)絡(luò),請訪問他的站點 http://amundsen.com/。此外,還可以在 http://www.amundsen.com/DotNetKB 站點上找到本文的更新和相關(guān)資料。
出處:Microsoft
責(zé)任編輯:cjj
上一頁 下一頁 使用 SQL Server 2000 創(chuàng)建數(shù)據(jù)存儲層1 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|