明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

應(yīng)用程序規(guī)劃與設(shè)計(jì) [1]

[摘要]摘要:了解如何規(guī)劃和設(shè)計(jì) ASP.NET 應(yīng)用程序。本文以一個(gè)知識(shí)庫(kù) Web 應(yīng)用程序?yàn)槔懻搶?shí)際應(yīng)用程序創(chuàng)建實(shí)踐中最常見的幾個(gè)因素。(本文包含一些指向英文站點(diǎn)的鏈接。)目錄簡(jiǎn)介 規(guī)劃基本 ASP.NET 應(yīng)用程序 定義應(yīng)用程序體系結(jié)構(gòu) 安全規(guī)劃 完成設(shè)計(jì)文檔 小結(jié)并付諸行動(dòng)簡(jiǎn)介 歡迎來到“進(jìn)入...

摘要:了解如何規(guī)劃和設(shè)計(jì) ASP.NET 應(yīng)用程序。本文以一個(gè)知識(shí)庫(kù) Web 應(yīng)用程序?yàn)槔,討論?shí)際應(yīng)用程序創(chuàng)建實(shí)踐中最常見的幾個(gè)因素。(本文包含一些指向英文站點(diǎn)的鏈接。)目錄簡(jiǎn)介
規(guī)劃基本 ASP.NET 應(yīng)用程序
定義應(yīng)用程序體系結(jié)構(gòu)
安全規(guī)劃
完成設(shè)計(jì)文檔
小結(jié)并付諸行動(dòng)簡(jiǎn)介 歡迎來到“進(jìn)入 ASP.NET 世界”。在隨后的幾周或幾個(gè)月中,本系列文章將逐步詳細(xì)介紹如何使用 Microsoft® ASP.NET 和 Microsoft Visual Studio® .NET 來設(shè)計(jì)、實(shí)現(xiàn)和部署典型的 Web 應(yīng)用程序,以探討實(shí)際應(yīng)用程序創(chuàng)建實(shí)踐中最常見的幾個(gè)因素。我們不僅僅布置一些 Web 窗體,也不局限于只對(duì)后端數(shù)據(jù)庫(kù)進(jìn)行一些數(shù)據(jù)綁定。數(shù)據(jù)綁定和 Web 窗體布局很重要,但是有許多其他問題也非常重要。例如,無論采用何種目標(biāo)平臺(tái)或語言,所有經(jīng)過良好編碼的項(xiàng)目都包括一些基本的規(guī)劃步驟,例如目標(biāo)聲明、用戶方案文檔,甚至用于標(biāo)識(shí)解決方案的物理邊界和邏輯邊界的體系結(jié)構(gòu)文檔。此外,在解決方案生命周期的早期就將安全規(guī)劃包含在內(nèi)是一種非常好的習(xí)慣。這些內(nèi)容與良好的數(shù)據(jù)庫(kù)模型、精心設(shè)計(jì)的中間件組件以及簡(jiǎn)潔的用戶界面設(shè)計(jì)一起,可以確保您最終在生產(chǎn)中部署的應(yīng)用程序是安全的、可靠的,并且是用戶友好的。此時(shí),一些讀者可能會(huì)認(rèn)為本文屬于那些基調(diào)很高的文章,目標(biāo)定位在某些超大型企業(yè)級(jí)方案,而這種方案根本不適用于一般的小工廠、愛好者或個(gè)人開發(fā)團(tuán)體。其實(shí)并不是這樣!即使只是創(chuàng)建您自己個(gè)人使用的基于 Web 的小型解決方案,從一開始就進(jìn)行完善的規(guī)劃將有助于確保流程最終的輕松實(shí)現(xiàn)和部署。而且,并不是高級(jí)的程序員或 Web 開發(fā)人員才可以使用這些技術(shù)。無論您的技術(shù)水平如何,也無論您屬于哪類目標(biāo)讀者,我相信您都會(huì)發(fā)現(xiàn)這一系列文章對(duì)您很有幫助,它為您提供了豐富的信息,而且(請(qǐng)?jiān)试S我這樣說)十分有趣。我們將生成一個(gè)稱為 DotNetKB 的示例知識(shí)庫(kù) Web 應(yīng)用程序,這個(gè)過程將貫穿整個(gè)系列文章。在作為第一篇文章的本文中,我們將介紹典型項(xiàng)目的設(shè)計(jì)階段,包括基本規(guī)劃、應(yīng)用程序體系結(jié)構(gòu)和實(shí)現(xiàn)方案設(shè)計(jì)。學(xué)習(xí)完本文后,您將已經(jīng)準(zhǔn)備好所有的文檔,并會(huì)迫不及待地希望開始創(chuàng)建解決方案。預(yù)備工作非常簡(jiǎn)單,我們跳過這部分內(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ī)劃不僅對(duì)于由多個(gè)開發(fā)人員建立的大型解決方案而言是必不可少的,而且即使對(duì)于最小的應(yīng)用程序,一個(gè)完善的 AP 也是非常重要的。創(chuàng)建 AP 有助于您在開始編碼“之前”就能仔細(xì)考慮一些常見問題。這樣,您可以在應(yīng)用程序生命周期的早期便完全了解挑戰(zhàn)和解決方案,而不是在完全陷入窘境之后才發(fā)現(xiàn)問題。在《Software Project Survival Guide》一書中,作者 Steve McConnell 指出:在軟件項(xiàng)目后期糾正錯(cuò)誤所花的成本與在早期階段發(fā)現(xiàn)并糾正這些錯(cuò)誤所花的成本相比,前者可能是后者的 50 - 200 倍。一個(gè)完善的項(xiàng)目規(guī)劃包含哪些內(nèi)容?可以包含許多內(nèi)容,但最基本的是要包含目標(biāo)聲明和一系列用戶方案。還有其他很多有用的資料,包括需求文檔、編碼標(biāo)準(zhǔn)、交付進(jìn)度、測(cè)試過程等。對(duì)于我們要建立的簡(jiǎn)單示例解決方案,將主要介紹簡(jiǎn)單的應(yīng)用程序聲明和一些用戶方案。同時(shí)還將解決一些其他問題。應(yīng)用程序聲明此系列文章要建立的項(xiàng)目(稱為 DotNetKB)是一個(gè)簡(jiǎn)單的知識(shí)庫(kù) Web 站點(diǎn),在這個(gè)站點(diǎn)中,用戶可以提各種問題,并可以得到授權(quán)“專家”的回答。這樣,以后訪問者在查找常見 ASP.NET 問題的解決方案時(shí),可以對(duì)得到的結(jié)果數(shù)據(jù)進(jìn)行搜索和過濾。這是對(duì)我們的 DotNetKB 項(xiàng)目的一個(gè)基本目標(biāo)聲明。DotNetKB 是一個(gè)基于 Web 的應(yīng)用程序,它可以列出訪問者提出的一系列問題,并顯示授權(quán)專家對(duì)這些問題作出的回復(fù)。訪問者可以向系統(tǒng)添加新問題,并可以按照問題的主題、問題和/或回答中的關(guān)鍵字來搜索和過濾這些問題。訪問者還可以按主題或按添加到系統(tǒng)中的日期來對(duì)問題列表進(jìn)行排序。授權(quán)專家可以登錄到應(yīng)用程序中已設(shè)置安全機(jī)制的部分,審閱問題,添加、編輯和刪除對(duì)一個(gè)問題的一個(gè)或多個(gè)回答。應(yīng)用程序管理員還可以建立專家登錄權(quán)限和登錄配置文件,以及添加、編輯和刪除問題主題。此外,還提供了一些基本統(tǒng)計(jì)信息,包括系統(tǒng)中問題和回答的數(shù)量,以及每個(gè)專家的回復(fù)數(shù)量和至今已被訪問的頁面數(shù)量。正如您從上面的聲明中看到的那樣,該解決方案非常簡(jiǎn)單。在閱讀目標(biāo)聲明時(shí),您可能會(huì)開始考慮可以添加到這個(gè)應(yīng)用程序的許多其他功能,以使應(yīng)用程序更加強(qiáng)大。這說明了項(xiàng)目目標(biāo)聲明的一個(gè)主要依據(jù),即避免“功能蔓延”。我們都清楚,如果更改最終結(jié)果本來基于的概念,簡(jiǎn)單的想法將導(dǎo)致非常龐大且歪曲的結(jié)果。有句老格言:“如果不知道要去往何方,你可能會(huì)在某個(gè)地方停下來”,它原本揭示的是夏季公路旅行,其道理同樣可用于軟件項(xiàng)目。一些項(xiàng)目的目標(biāo)聲明中可能需要包含更多的信息。而對(duì)于我們的使用,上面的目標(biāo)聲明就符合要求。現(xiàn)在我們對(duì)于要完成的應(yīng)用程序有了一個(gè)清晰的認(rèn)識(shí),接下來需要一些詳細(xì)的信息來描述用戶如何與系統(tǒng)交互以及用戶需要執(zhí)行哪些任務(wù)來完成目標(biāo)。我們需要一系列用戶方案。文檔化用戶方案用戶方案沒有什么令人驚異之處。通常,它們只是描述用戶如何與應(yīng)用程序交互。用戶方案的關(guān)鍵價(jià)值在于記錄了關(guān)于每個(gè)人對(duì)用戶希望系統(tǒng)如何運(yùn)行以及應(yīng)用程序應(yīng)如何響應(yīng)的設(shè)想。通過完成這個(gè)過程,您將可以完全了解處理各種用戶與系統(tǒng)的交互時(shí)所需的數(shù)據(jù)點(diǎn)和函數(shù)。換句話說,編寫完善的用戶方案將有助于您確定完成解決方案需要實(shí)現(xiàn)的數(shù)據(jù)庫(kù)、中間件和用戶界面元素。注意:Visual Studio .NET Enterprise Architect 有一項(xiàng)非常不錯(cuò)的功能,即允許您使用 Microsoft Visio® 通過 UML(統(tǒng)一建模語言)創(chuàng)建用戶方案,然后生成這些方案的基本代碼。在這里,我不打算深入探討這些細(xì)節(jié),但是您可以在 MSDN® Academic Alliance 站點(diǎn)找到一篇關(guān)于這一主題的好文章 Generating .NET Code Using Visio Enterprise Architect's UML,作者是 Sreedhar Koganti。有了上一節(jié)的目標(biāo)聲明后,下面是 DotNetKB 項(xiàng)目的幾個(gè)示例用戶方案。搜索知識(shí)庫(kù)匿名用戶可以輸入一個(gè)或多個(gè)關(guān)鍵字并執(zhí)行搜索,搜索將返回包含這些關(guān)鍵字的問題和/或回答列表。用戶可以將關(guān)鍵字搜索鎖定在僅搜索問題、僅搜索回答或者二者都搜索。返回的列表將顯示問題及其回復(fù)數(shù)和被其他用戶訪問的次數(shù)。單擊鏈接將返回以時(shí)間先后逆序排列的回復(fù)(純文本)列表。將新問題輸入到知識(shí)庫(kù)中匿名用戶可以瀏覽用于向數(shù)據(jù)庫(kù)輸入新問題以供授權(quán)專家審閱和回復(fù)的屏幕。用戶可以輸入問題的標(biāo)題和內(nèi)容,并可以選擇在一系列主題中的某個(gè)主題下記錄該問題。用戶還可以輸入他們的名字和相關(guān)的 URL(電子郵件、Web 地址等)。輸入將被驗(yàn)證,以確保包含必需的數(shù)據(jù)并確保所有輸入數(shù)據(jù)不會(huì)受到腳本攻擊等。一旦數(shù)據(jù)經(jīng)過驗(yàn)證并被保存到數(shù)據(jù)庫(kù)中,用戶將看到一個(gè)響應(yīng)屏幕,感謝用戶的支持并將用戶直接連接到主頁。此外,用戶還可以選擇讓該站點(diǎn)“記住”他們的姓名和 URL 以備以后訪問該站點(diǎn)時(shí)使用。您已經(jīng)了解它的工作原理了,對(duì)嗎?每一個(gè)方案都嘗試細(xì)化用戶交互的重要方面。例如,上面列出的兩個(gè)方案表明用戶為“anonymous”(匿名用戶),這表示這類用戶不需要登錄或進(jìn)行其他方式的授權(quán)。第二個(gè)示例還標(biāo)識(shí)了若干輸入值、驗(yàn)證步驟和可選操作。當(dāng)然,這只是兩個(gè)示例;完整的系統(tǒng)需要更多的方案。此外,需要特別注意的是,“用戶”不僅僅可以是人,也可以是您的程序需要與其通信的其他應(yīng)用程序,甚至還可以是您的應(yīng)用程序的其他部分。例如,一個(gè)方案描述主頁如何列出最近添加到知識(shí)庫(kù)中的內(nèi)容,以供任何人查看。此例中的“用戶”將是主頁自身。還有一些方案描述專家如何查找和回復(fù)新問題以及管理員如何更新主題列表并管理系統(tǒng)的其他部分。我已為討論這個(gè)簡(jiǎn)單的應(yīng)用程序標(biāo)識(shí)了 20 多種方案。您可以在 DotNetKB 中找到當(dāng)前列表(以及與此項(xiàng)目相關(guān)的所有其他資料)。至此我們就有了目標(biāo)聲明和一些用戶方案,F(xiàn)在,是時(shí)候稍憩一下,然后學(xué)學(xué)一些技術(shù)了。我們需要定義應(yīng)用程序體系結(jié)構(gòu),這可以幫助我們以“鮮活有效的代碼”實(shí)際實(shí)現(xiàn)方案。定義應(yīng)用程序體系結(jié)構(gòu) 有了基本的目的和為解決方案開發(fā)的用戶方案列表后,您需要開始籌劃整體的體系結(jié)構(gòu)。主要目標(biāo)是標(biāo)識(shí)應(yīng)用程序的邏輯方面和物理方面,即如何將應(yīng)用程序拆分為各種有用的部分。在本節(jié)中還添加了安全性方面的內(nèi)容。安全是在規(guī)劃的“一開始”您就需要考慮的問題,而不是在開發(fā)周期中“最后添加”的內(nèi)容。我們稍后會(huì)在本節(jié)中詳細(xì)討論這個(gè)問題。邏輯體系結(jié)構(gòu)從邏輯上講,您需要規(guī)劃解決方案以標(biāo)識(shí)數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)訪問、業(yè)務(wù)規(guī)則、用戶界面等之間的“邊界”。通常,Web 開發(fā)人員會(huì)選擇一個(gè)兩階段模型,并用 Web 窗體存儲(chǔ)用于訪問現(xiàn)有數(shù)據(jù)存儲(chǔ)系統(tǒng)(例如 Microsoft SQL Server)的所有代碼。一個(gè)更有效的方法是創(chuàng)建一個(gè)位于 Web 窗體用戶界面與 SQL Server 數(shù)據(jù)存儲(chǔ)系統(tǒng)之間的中間層組件庫(kù)。這種三層方法(Web 窗體、組件、數(shù)據(jù)庫(kù))通常是大多數(shù)應(yīng)用程序所需的。但是,在某些情況下,可能需要一個(gè)其他層來處理服務(wù)器之間傳輸?shù)臄?shù)據(jù)。這個(gè)傳輸層可以使用獨(dú)立于平臺(tái)的協(xié)議(例如 XML-SOAP)來實(shí)現(xiàn)。但是,如果您從頭到尾都使用 Microsoft .NET 技術(shù),則可以使用 .NET 遠(yuǎn)程協(xié)議的二進(jìn)制版來完成這一任務(wù),而且速度比使用 XML-SOAP 要快得多。對(duì)于我們的示例,我們將定義三個(gè)邏輯邊界:用戶界面(Web 窗體)、中間層(一個(gè) .NET 組件程序集)和數(shù)據(jù)層(SQL Server 數(shù)據(jù)庫(kù))。圖 1 顯示了如何表示這一內(nèi)容。
圖 1:三層圖現(xiàn)在我們有一個(gè)簡(jiǎn)單的邏輯模型。它是如何起作用的?它有助于我們考慮各個(gè)邏輯組之間的邊界。每個(gè)邏輯層應(yīng)盡量與其他層獨(dú)立。理想的情況是,圖層中的更改應(yīng)該對(duì)整體產(chǎn)生最小的影響。例如,如果將數(shù)據(jù)存儲(chǔ)從 SQL Server 更改到 XML 數(shù)據(jù)文件,唯一受到影響的圖層應(yīng)是中間層圖層。用戶界面應(yīng)該根本無需考慮更改。這會(huì)使您進(jìn)行思考:如何實(shí)現(xiàn)解決方案的實(shí)際編碼以實(shí)現(xiàn)此原則。另外,邏輯層有助于我們考慮安全問題。各個(gè)圖層之間的邊界都存在潛在的安全漏洞。而且,各個(gè)圖層可能有自己特定的安全措施(SQL Server 權(quán)限、.NET 運(yùn)行時(shí)權(quán)限、ASP.NET 安全等)。同樣,我們稍后會(huì)在本節(jié)中詳細(xì)討論這個(gè)問題。物理體系結(jié)構(gòu)確定邏輯層后,考慮物理層也很重要。例如,您可以在同時(shí)安裝有 SQL Server、Internet Information Server、ASP.NET 和 .NET 運(yùn)行時(shí)的單個(gè)實(shí)際計(jì)算機(jī)上實(shí)現(xiàn)這個(gè)應(yīng)用程序。這將是一個(gè)物理層。但更可靠且可擴(kuò)展的方法是:在由三個(gè) Web 服務(wù)器組成的簇上部署 Web 窗體,在兩個(gè)應(yīng)用服務(wù)器上部署 .NET 組件程序集,在兩個(gè)故障恢復(fù)模式的 SQL Server 上部署數(shù)據(jù)庫(kù)。這樣產(chǎn)生的物理體系結(jié)構(gòu)將七個(gè) Windows 服務(wù)器包含在三個(gè)主要組中:Web 簇、組件簇和數(shù)據(jù)庫(kù)簇。如果您了解系統(tǒng)的不同邏輯部件可以位于不同的計(jì)算機(jī)上,您可能會(huì)實(shí)現(xiàn)不同的代碼。對(duì)于我們的示例,我們采用一個(gè)有效且強(qiáng)大的兩層模型:Web 服務(wù)器托管用戶界面和組件,數(shù)據(jù)庫(kù)服務(wù)器托管 SQL Server 數(shù)據(jù)存儲(chǔ)。如果通信量非常大,這個(gè)模型使我們可以靈活地在簇中添加更多的服務(wù)器,并使其保持足夠的簡(jiǎn)潔以便于處理。下面的圖像顯示了此物理體系結(jié)構(gòu)與前面定義的邏輯體系結(jié)構(gòu)之間的映射關(guān)系。

圖 2:物理體系結(jié)構(gòu)與三層體系結(jié)構(gòu)之間的映射關(guān)系正如您看到的那樣,邏輯體系結(jié)構(gòu)和物理體系結(jié)構(gòu)不必相同。在規(guī)劃階段還要考慮一項(xiàng)內(nèi)容:安全。安全規(guī)劃 Microsoft 有一個(gè)關(guān)于安全性與軟件這一主題的歌訣:“Secure by design, secure by default, and secure by deployment(設(shè)計(jì)安全,默認(rèn)安全和部署安全)”。即,在安全中設(shè)計(jì),期待系統(tǒng)在默認(rèn)情況下是安全的,以及創(chuàng)建可以在安全環(huán)境中成功部署的解決方案。安全始終是重要的。既然越來越多的軟件要在公用的 Internet 上“生存”,編寫安全的軟件就更加關(guān)鍵。對(duì)于我們而言,幸運(yùn)的是,.NET 運(yùn)行時(shí)和 Windows 操作系統(tǒng)提供廣泛的安全選項(xiàng)和功能,我們可以輕松地將其包含在我們的應(yīng)用程序中。無需過分注重標(biāo)識(shí)和消除聯(lián)機(jī)解決方案中安全漏洞的細(xì)節(jié),我們可以指出其中一些最常見的漏洞并指出我們的應(yīng)用程序規(guī)劃如何進(jìn)行處理。注意:有關(guān)可用選項(xiàng)的詳細(xì)信息,請(qǐng)參閱 Microsoft Security Developer Center。緩沖區(qū)溢出這可能是已編譯應(yīng)用程序中最常見的安全漏洞。由于我們將使用 .NET 運(yùn)行時(shí),而它是設(shè)計(jì)用來在內(nèi)存中安全運(yùn)行的,因此不太可能發(fā)生緩沖區(qū)溢出。此外,我們使用 Microsoft Visual Basic® .NET 對(duì)解決方案進(jìn)行編碼,而 Microsoft Visual Basic® .NET 不像 C 或 C++ 那樣容易受到緩沖區(qū)溢出問題的影響。但是,即使我們打算用 C++ 創(chuàng)建組件,我們還可以使用編譯程序的特殊功能,GS 轉(zhuǎn)換,來保護(hù)我們免受大多數(shù)緩沖區(qū)溢出的攻擊。數(shù)據(jù)庫(kù)攻擊另一種常見的安全漏洞可能會(huì)使惡意用戶獲得訪問存儲(chǔ)在數(shù)據(jù)庫(kù)中的原始數(shù)據(jù)的權(quán)限。為了防止黑客獲得數(shù)據(jù)的控制權(quán),我們僅使用 SQL Server 存儲(chǔ)過程,而不使用“內(nèi)聯(lián)查詢”。這樣可以大大減少試圖在輸入流中插入其他 SQL 命令的攻擊。我們還在程序中多個(gè)位置處使用輸入驗(yàn)證,以確保所有輸入僅包含有效的字符。交叉站點(diǎn)腳本攻擊對(duì) Web 應(yīng)用程序進(jìn)行的常見攻擊還有一種,它涉及到用戶在輸入流中添加客戶方腳本,這類攻擊將執(zhí)行附加的對(duì)話并誘騙用戶將個(gè)人數(shù)據(jù)發(fā)送到黑客自己的 Web 站點(diǎn)。要解決這個(gè)問題,我們使用 ASP.NET 1.1 的一個(gè)新功能,過濾出這種惡意代碼的所有輸入,防止將它置入系統(tǒng)中。顯示屏幕上還包含附加代碼,它將自動(dòng)禁用任何腳本或顯示可能會(huì)插入到數(shù)據(jù)存儲(chǔ)中的標(biāo)記。至此,我們已獲得了應(yīng)用程序的邏輯模型和物理模型,以及確保實(shí)現(xiàn)方案包含的安全功能清單。擁有了這些以及目標(biāo)聲明和用戶方案,我們可以開始這次“編碼前”探險(xiǎn)的最后一部分了。完成設(shè)計(jì)文檔 在直接進(jìn)入項(xiàng)目的編碼部分之前,需要花一點(diǎn)時(shí)間實(shí)際勾畫出應(yīng)用程序的邏輯組件,這非常重要。在我們的示例解決方案中,我們要實(shí)現(xiàn)解決方案的三個(gè)邏輯組件:數(shù)據(jù)庫(kù)、.NET 數(shù)據(jù)訪問組件和 ASP.NET 用戶界面。在下面幾篇文章中,我們將非常詳細(xì)地介紹如何實(shí)現(xiàn)這些組件。但現(xiàn)在,我們只是勾畫出每個(gè)組件的大致輪廓,討論過程中最重要的方面,即文檔化組件間的交互。數(shù)據(jù)庫(kù)對(duì)于 DotNetKB 應(yīng)用程序,我們需要將數(shù)據(jù)存儲(chǔ)在三張表中:主題、問題和回答(請(qǐng)參閱下圖)。

圖 3:主題、問題和回答表我們需要使用存儲(chǔ)過程,以使中間層組件也可以安全地訪問數(shù)據(jù)。有關(guān)數(shù)據(jù)庫(kù)的細(xì)節(jié),我們將在下一篇文章中討論。這里,我們只是指出:列出表名稱及所有列細(xì)節(jié)、默認(rèn)索引和存儲(chǔ)過程列表的數(shù)據(jù)庫(kù)文檔,應(yīng)該包含在一個(gè)完整的數(shù)據(jù)庫(kù)設(shè)計(jì)文檔中。即,文檔中應(yīng)該具有成功實(shí)現(xiàn)系統(tǒng)數(shù)據(jù)存儲(chǔ)部分所需的詳細(xì)信息。注意:如果留心的話,您可能會(huì)注意到我們未提及將專家數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中。只是為了使項(xiàng)目更加有趣(同時(shí)給我們一個(gè)機(jī)會(huì)使用直接 XML 數(shù)據(jù)存儲(chǔ)),我們將專家信息存儲(chǔ)在一個(gè) XML 數(shù)據(jù)文件中。數(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ì)象”庫(kù),我們的解決方案可以更輕松地支持那些不能同時(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 PropertyEnd ClassPublic 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 SubEnd 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 tEnd 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ù)量一樣重要。要使文檔簡(jiǎn)潔,通常在一個(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)題”的長(zhǎng)度限制為 30 個(gè)字符,“描述”的長(zhǎng)度限制為 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)題”的長(zhǎng)度限制為 30 個(gè)字符,“描述”的長(zhǎng)度限制為 500 個(gè)字符。更新完成后,將顯示一條響應(yīng)消息指出已確認(rèn)更新;如果更新失敗,則顯示一條消息指出錯(cuò)誤狀況。利用上面的敘述,您可以輕松地實(shí)現(xiàn)一個(gè)完整的功能屏幕。判斷一個(gè)好的設(shè)計(jì)文檔的方法是:它能夠使讀者完成工作,且不會(huì)提出額外的問題。最終的用戶界面設(shè)計(jì)文檔將包括應(yīng)用程序中每個(gè)屏幕的此類敘述。小結(jié)并付諸行動(dòng) 我們簡(jiǎn)要介紹了數(shù)據(jù)庫(kù)、中間層和用戶界面實(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ù)量。在下一篇文章中,我們將討論使用 Visual Studio .NET 在 SQL Server 中建立數(shù)據(jù)存儲(chǔ)系統(tǒng)的有關(guān)細(xì)節(jié)。我們將定義數(shù)據(jù)表,創(chuàng)建必需的存儲(chǔ)過程,并設(shè)置正確的數(shù)據(jù)訪問,以確保任何組件和數(shù)據(jù)本身之間具有安全可靠的連接。至此,您已經(jīng)看到了一個(gè)如何創(chuàng)建應(yīng)用程序規(guī)劃的可用示例,可以開始考慮如何在您自己的工作中使用這些元素來提高項(xiàng)目的整體質(zhì)量和生產(chǎn)率。有關(guān)項(xiàng)目規(guī)劃以及規(guī)劃如何影響軟件質(zhì)量的詳細(xì)信息,請(qǐng)參閱 Steve McConnell 的 Software Project Survival Guide。Mike Amundsen 提供培訓(xùn)、演講和咨詢服務(wù)。要了解他的詳細(xì)信息或與他聯(lián)絡(luò),請(qǐng)?jiān)L問他的站點(diǎn) http://amundsen.com/。此外,還可以在 http://www.amundsen.com/DotNetKB 站點(diǎn)上找到本文的更新和相關(guān)資料。