剛開始打開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的整體架構就是這樣子了,可以說這是經典的三層架構啦!!