通過前面的文章,我們對.NET Petshop的整個結(jié)構(gòu)有了一個大致的了解,也清楚的知道了數(shù)據(jù)庫的設(shè)計(jì)模式和實(shí)現(xiàn)的細(xì)節(jié),尤其值得一提的是通過存儲過程訪問數(shù)據(jù)庫。在接下來的這篇文章里,我將和大家一起來探究一下.NET Petshop的中間層。
根據(jù)三層結(jié)構(gòu)的設(shè)計(jì)原則,中間層封裝的是業(yè)務(wù)邏輯和規(guī)則,在這個網(wǎng)絡(luò)寵物商店的例子中,購物處理,訂單處理,賬號管理,產(chǎn)品查詢等等都是具體的業(yè)務(wù)邏輯,至于與用戶交互并不是中間層要處理的問題。它處理是與具體的用戶界面和交互無關(guān),而僅僅是核心的商業(yè)規(guī)則和邏輯。.NET Petshop的中間層業(yè)務(wù)邏輯被封裝為一個.NET 組件,它的命名空間為Pet Shop.Components(編譯后在bin的文件夾里面有一個petshop.dll的文件)。圖1是.NET Petshop解決方案中間層的類視圖和文件視圖。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
圖1:.NET Petshop解決方案中間層的類視圖和文件視圖
接下來,我們模擬顧客到百貨超市采購日常用品的過程來說明運(yùn)作的流程以及抽象出重要的概念(實(shí)際上User case,我們在領(lǐng)域分析的時候會這么做,并且是很重要的一步,從這里可以初步的發(fā)現(xiàn)在我們實(shí)施的系統(tǒng)中將要涉及到的邏輯實(shí)體,進(jìn)而可以為數(shù)據(jù)庫建模設(shè)計(jì)以及類設(shè)計(jì)提供參考)。
購物用例的業(yè)務(wù)分析:
1 客戶有購買商品的意愿;
2 客戶到登陸管理員處登記,且成功登記;
3 在登記處推一個購物車;
4 在超市內(nèi)查找所購商品類別存放的貨架;
5 在具體的貨架上查找某一具體品牌的商品;
6 將符合意愿的商品放入自己的購物車;
7 重復(fù)4-6;
8 購物完畢;
9 到付款處計(jì)算總價格并付款;
10 打印購物清單;
11 退還購物車;
12 取走購物,購物完畢;
備注:在這個用例中,我們做了一些前提和假設(shè),為的是方便.NET Petshop的分析,比如說在實(shí)際生活中根本就不需要第二步。
通過這個用例的分析,我們至少可以抽象出一下幾個重要概念,并且能在應(yīng)用程序里面找到對應(yīng)的類:客戶對應(yīng)Customer、商品對應(yīng)Product、購物車對應(yīng)ShoppingCart、商品類別對應(yīng)Category、具體商品對應(yīng)Item、清單對應(yīng)Order。
正如我前面說過的,這幾個概念對于我們的業(yè)務(wù)建模和系統(tǒng)建模是非常有用的。正是通過這樣的分析,在.NET Petshop的業(yè)務(wù)邏輯里面共有9個核心類和5個輕量級的數(shù)據(jù)結(jié)構(gòu)類。同樣的方式,我在這里列出這些類,并加以說明(見表1)。
類名稱
|
說明
|
BasketItem
|
代表購物車ShoppingCart里的一項(xiàng)購物商品。
|
Customer
|
用于賬號管理和登陸驗(yàn)證。
|
CustomerDetails
|
用戶賬號的詳細(xì)信息。
|
CustomerAddress
|
用戶賬號的地址信息。
|
Error
|
用于登陸出錯的幫助功能。
|
Item
|
代表某類產(chǎn)品中的具體一項(xiàng)商品。
|
ItemResults
|
搜索Item的結(jié)果集。
|
Order
|
購物完畢后的購物清單和訂單。
|
Product
|
大類別里面的某類產(chǎn)品。
|
ProductResults
|
搜索產(chǎn)品的結(jié)果集。
|
Profile
|
用戶的配置。
|
ShoppingCart
|
購物車,用于購物的整個過程,直到下訂單。
|
Database
|
通過ADO.NET訪問數(shù)據(jù)庫,封裝了具體的訪問方法。
|
SearchResults
|
模糊搜索的結(jié)果集。
|
表1:.NET Petshop中間層的類
CustomerAddress, CustomerDetails, ItemResults, ProductResults, and SearchResults這幾個輕量級的數(shù)據(jù)結(jié)構(gòu)類為在數(shù)據(jù)層和展示層之間提供了一種松散的數(shù)據(jù)綁定調(diào)用。這些類都被設(shè)計(jì)為有公開的屬性,ASP.NET 的web頁面可以通過這些屬性訪問數(shù)據(jù)。下面這段類的代碼說明了這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詳解(二)中我們就說過數(shù)據(jù)庫的訪問是通過存儲來進(jìn)行的,我們看看下面這部分代碼就知道了:
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做為輸入?yún)?shù)傳遞給存儲過程upAccountLogin的,這個存儲過程完成在Sigon用戶賬號表里面查找該用戶是否合法,最后返回一個字符串的用戶ID值。在這里沒有使用SQL查詢語句,很好的分離了邏輯。具體的數(shù)據(jù)庫訪問是通過Database來完成的,我們將在后面的文章中繼續(xù)探討它的運(yùn)作。
ShoppingCart是比較有意思的一個類,也是很重要的一個類。它是與狀態(tài)有關(guān)的一個類,在.NET Petshop里面,它的狀態(tài)是通過ASP.NET Session state來管理的,關(guān)于其進(jìn)一步的細(xì)節(jié)留待后面討論。
.NET Petshop的中間層的探討先到此,我在這里只是拋磚引玉,很多的東西要深入代碼才可以搞的更加清楚。歡迎大家繼續(xù)與我一起關(guān)注下一篇.NET Petshop的數(shù)據(jù)展示層。
|