.NET Petshop詳解(三):petshop三層結構之MiddleTire
通過前面的文章,我們對.NET Petshop的整個結構有了一個大致的瞭解,也清楚的知道了數據庫的設計模式和實現的細節,尤其值得一提的是通過存儲過程訪問數據庫。在接下來的這篇文章裏,我將和大家一起來探究一下.NET Petshop的中間層。
根據三層結構的設計原則,中間層封裝的是業務邏輯和規則,在這個網絡寵物商店的例子中,購物處理,訂單處理,帳號管理,產品查詢等等都是具體的業務邏輯,至於與用戶交互並不是中間層要處理的問題。它處理是與具體的用戶界面和交互無關,而僅僅是核心的商業規則和邏輯。.NET Petshop的中間層業務邏輯被封裝爲一個.NET 組件,它的命名空間爲Pet Shop.Components(編譯後在bin的文件夾裏面有一個petshop.dll的文件)。圖1是.NET Petshop解決方案中間層的類視圖和文件視圖。
圖1:.NET Petshop解決方案中間層的類視圖和文件視圖
接下來,我們模擬顧客到百貨超市採購日常用品的過程來說明運作的流程以及抽象出重要的概念(實際上User case,我們在領域分析的時候會這麼做,並且是很重要的一步,從這裏可以初步的發現在我們實施的系統中將要涉及到的邏輯實體,進而可以爲數據庫建模設計以及類設計提供參考)。
購物用例的業務分析:
1 客戶有購買商品的意願;
2 客戶到登陸管理員處登記,且成功登記;
3 在登記處推一個購物車;
4 在超市內查找所購商品類別存放的貨架;
5 在具體的貨架上查找某一具體品牌的商品;
6 將符合意願的商品放入自己的購物車;
7 重複4-6;
8 購物完畢;
9 到付款處計算總價格並付款;
10 打印購物清單;
11 退還購物車;
12 取走購物,購物完畢;
備註:在這個用例中,我們做了一些前提和假設,爲的是方便.NET Petshop的分析,比如說在實際生活中根本就不需要第二步。
通過這個用例的分析,我們至少可以抽象出一下幾個重要概念,並且能在應用程序裏面找到對應的類:客戶對應Customer、商品對應Product、購物車對應ShoppingCart、商品類別對應Category、具體商品對應Item、清單對應Order。
正如我前面說過的,這幾個概念對於我們的業務建模和系統建模是非常有用的。正是通過這樣的分析,在.NET Petshop的業務邏輯裏面共有9個核心類和5個輕量級的數據結構類。同樣的方式,我在這裏列出這些類,並加以說明(見表1)。
類名稱
|
說明
|
BasketItem
|
代表購物車ShoppingCart裏的一項購物商品。
|
Customer
|
用於帳號管理和登陸驗證。
|
CustomerDetails
|
用戶帳號的詳細信息。
|
CustomerAddress
|
用戶帳號的地址信息。
|
Error
|
用於登陸出錯的幫助功能。
|
Item
|
代表某類產品中的具體一項商品。
|
ItemResults
|
搜索Item的結果集。
|
Order
|
購物完畢後的購物清單和訂單。
|
Product
|
大類別裏面的某類產品。
|
ProductResults
|
搜索產品的結果集。
|
Profile
|
用戶的配置。
|
ShoppingCart
|
購物車,用於購物的整個過程,直到下訂單。
|
Database
|
通過ADO.NET訪問數據庫,封裝了具體的訪問方法。
|
SearchResults
|
模糊搜索的結果集。
|
表1:.NET Petshop中間層的類
CustomerAddress, CustomerDetails, ItemResults, ProductResults, and SearchResults這幾個輕量級的數據結構類爲在數據層和展示層之間提供了一種鬆散的數據綁定調用。這些類都被設計爲有公開的屬性,ASP.NET 的web頁面可以通過這些屬性訪問數據。下面這段類的代碼說明了這5個類是如何暴露自己的公開屬性供展示層使用的。
public class ProductResults
{
private string m_productid;
private string m_name;
public string productid {
get { return m_productid; }
set { m_productid = value; }
}
public string name {
get { return m_name; }
set { m_name = value; }
}
}
在.NET Petshop詳解(二)中我們就說過數據庫的訪問是通過存儲來進行的,我們看看下面這部分代碼就知道了:
public string Login(string userName, string password) {
string customerID;
// params to stored proc
Database data = new Database();
SqlParameter[] prams = {
data.MakeInParam("@username", SqlDbType.VarChar, 25, password),
data.MakeInParam("@password", SqlDbType.VarChar, 25, userName),
data.MakeOutParam("@CustomerID", SqlDbType.VarChar, 25)
};
// create data object and params
data.RunProc("upAccountLogin", prams); // run the stored procedure
customerID = (string) prams[2].Value; // get the output param value
// if the customer id is an empty string, then the login failed
if (customerID == string.Empty)
return null;
else
return customerID;
}
這段代碼是Customer類的Login方法,它是通過將用戶輸入的用戶名userName和密碼password做爲輸入參數傳遞給存儲過程upAccountLogin的,這個存儲過程完成在Sigon用戶帳號表裏面查找該用戶是否合法,最後返回一個字符串的用戶ID值。在這裏沒有使用SQL查詢語句,很好的分離了邏輯。具體的數據庫訪問是通過Database來完成的,我們將在後面的文章中繼續探討它的運作。
ShoppingCart是比較有意思的一個類,也是很重要的一個類。它是與狀態有關的一個類,在.NET Petshop裏面,它的狀態是通過ASP.NET Session state來管理的,關於其進一步的細節留待後面討論。
.NET Petshop的中間層的探討先到此,我在這裏只是拋磚引玉,很多的東西要深入代碼纔可以搞的更加清楚。歡迎大家繼續與我一起關注下一篇.NET Petshop的數據展示層。