剛開始打開PetShop項目的時候,我們未免會被如此多的項目嚇一跳,不過只要用心的去分析,看懂它並不是非常難的事。
首先我們來看一下WEB項目,因爲我們做WEB應用程序首先想到的就是看看頁面是怎麼實現的,然後一路追溯下去,直到看明白程序是如何把數據顯示到頁面和如何處理頁面的數據的。
比如說首頁吧,Default.aspx,我們看到首頁很簡單,大多數是靜態的,只顯示了一個Categories菜單,下面是對應的HTML代碼
<PetShopControl:NavigationControl ID="Categories" runat="server"></PetShopControl:NavigationControl>
而這些PetShopControl,NavigationControl標籤是什麼呢,我們可以在頁面HTML代碼的上方看到一行
<%@ Register Src="Controls/NavigationControl.ascx" TagName="NavigationControl" TagPrefix="PetShopControl" %>
指令,通過這行指令我們可以看到Categories菜單是通過NavigationControl.ascx用戶控件實現的
那好,我們現在就來打開 NavigationControl.ascx ,NavigationControl.ascx 裏面有一個Repeater控件,然後我們來看看NavigationControl.ascx的後臺代碼NavigationControl.ascx.cs
頁面初紿化Page_Load調用兩個函數GetControlStyle();BindCategories();
其中GetControlStyle()是爲了實現菜單在首頁和其它頁面顯示不同的風格,BindCategories()方法就是綁定數據了。
BindCategories() {
Category category = new Category();
repCategories.DataSource = category.GetCategories();
repCategories.DataBind();
}
在BindCategories()方法中有個類Category,Category是在BLL項目中實現的,我們可以單擊右鍵點轉到定義快速的找到它,category.GetCategories()方法我們也可以快速的找到它的定義
表現層到這就轉到業務層了,現在我們來看看業務層如何實現Category類,業務層的GetCategories()方法實現如下
public IList<CategoryInfo> GetCategories() {
return dal.GetCategories();
}
而變量 dal 在類中有定義
private static readonly ICategory dal = PetShop.DALFactory.DataAccess.CreateCategory();
然後我們再看到PetShop.DALFactory.DataAccess.CreateCategory()
在DataAccess類的CreateCategory()方法中我們所看到的並沒有具體的數據操作,取而代之的是
string className = path + ".Category";
return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
我們可以看到 path 的定義
private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
path是WEB.config中定義的WebDAL節點值,我們來看看Web.config中的WebDAL值,如果裝的是SQL數據庫的話應該是 “PetShop.SQLServerDAL”
原來語句“Assembly.Load(path).CreateInstance(className)”就是通過Web.config配置來實例化PetShop.SQLServerDAL集合中的Category類,然後我們纔在PetShop.SQLServerDAL.Category看到方法GetCategories()的具體實現
但是何必運用如此煩雜的步驟來實現對數據的操作呢,細想一下,不同的用戶有不同的數據庫,例如我們可以使用SQL SERVER,也可以使用Oracle數據庫,爲了輕鬆的實現對不同數據庫的訪問而不修改業務層,降低各層之間的偶合,所以PetShop運用了設計模式中的抽象工廠模式Factory,而爲什麼表現層和業務層之間不需要這樣做,因爲業務層的業務規則一般都是固定的,所以沒必要寫幾個業務層,如果應用程序中的業務層是時常變動的,或開發的是通用的WEB應用程序,針對不同的企業有不同的業務層,而表現層卻一樣,也可以運用抽象工廠模式。
PetShop的整體架構就是這樣子了,可以說這是經典的三層架構啦!!
由於整體已經有22個項目,所以,對於初學者一看就暈了,所以,我做了分解,可以大體上分幾塊去理解。
序號 |
項目名稱 |
描述 |
1 |
WEB |
表示層 |
2 |
Model |
業務實體 |
3 |
BLL |
業務邏輯層 |
4 |
DALFactory |
數據層的抽象工廠 |
5 |
IDAL |
數據訪問層接口定義 |
6 |
SQLServerDAL |
SQLServer數據訪問層 |
7 |
OracleDAL |
Oracle數據訪問層 |
8 |
DBUtility |
數據庫訪問組件基礎類 |
9 |
CacheDependencyFactory |
緩存依賴類的工廠類 |
10 |
ICacheDependency |
緩存依賴類接口 |
11 |
TableCacheDependency |
緩存依賴實現類 |
12 |
IBLLStrategy |
同步/異步處理策略接口(實現在bll根據配置反射選擇) |
13 |
MessagingFactory |
異時處理消息隊列的抽象工廠 |
14 |
IMessaging |
異時處理消息隊列接口定義 |
15 |
MSMQMessaging |
異時處理消息隊列的實現 |
16 |
Profile |
Profile的數據訪問層 |
17 |
ProfileDALFactory |
ProfileDAL的工廠類(反射創建ProfileDAL) |
18 |
IProfileDAL |
Profile的數據訪問層接口定義 |
19 |
OracleProfileDAL |
Oracle的Profile Providers 做用戶狀態管理 |
20 |
SQLProfileDAL |
SQL Server 的Profile Providers 做用戶狀態管理 |
21 |
Membership |
Membership認證和授權管理 |
22 |
OrderProcessor |
後臺處理進程,處理訂單隊列 |