安裝好的petshop3.0之后,帶著激動的心情把所有的功能都使用了一遍,petshop可應了一句話"麻雀雖小,五臟俱全",所以越來越喜歡它了,有如相見恨晚的感覺.我的目標就是領悟它的設計思想和學習它的優秀編碼習慣.當然下面的資料部分是引用MSDN和網上的資料的,再加上個人的分析而成的.希望逐步形成一個很好的學習資料.
1. DOT NET 的整體邏輯體系結構:
Petshop在3.x版本已經使用了n(n=3)層結構,分別是Presentation Layer(表示層)/Business Logic Layer(業務邏輯層BLL)/Data Access Layer(數據訪問層DAL),表示層使用了ASP.NET Web Forms,與業務邏輯層的C#組件通訊,業務組件通過ADO和SQL Server 的DAAB來訪問數據庫,petshop3.0安裝的時候有sqlserver2000和oracle兩種數據庫可以選擇.它是通過\web\web.config文件來識別究竟放在那個數據庫.
如圖:
2. 應用程序數據模型:
PetShop有兩個數據庫實例,分別是MSPetShop和MSPetShoporders,它們的表如下:
表名????????????????????????????? 作用
Accout???????????????????????????客戶的基本信息
BannerData???????????????????? 存儲廣告條
Category???????????????????????? 目錄類別(總的分類)
Inventory?????????????????????????產品庫存的狀態
Item???????????????????????????????? 產品的具體細節
LineItem????????????????????????? 定單的細節
Orders??????????????????????????? 用戶下的定單,定單包括一個或者多個行項目
OrderStatus??????????????????? 記錄定單的狀態
Products???????????????????????? 產品表
Profile??????????????????????????? 客戶的配置情況表
SignOn????????????????????????? 客戶登陸表
Supplier???????????????????????? 供應商情況表
表的關系:(使用sql server2000自帶的建立數據庫關系圖工具)
MSPetShop實例表的關系:
MSPetShopOrders實例表的關系:
3. PetShop在Visual .Net 2003的解決方案
系統元素介紹:
下面分析各個項目在系統中的作用
項目名 作用
BLL 業務邏輯組件的地方
ConfigTool????????????????????????? 用來加密連接字符串和創建日志事件源的管理應用程序
DALFactory?????????????????????????? 用來決定加載哪一個數據庫訪問程序集的類
IDAL????????????????????????????????????? 定義所有DAL都必須實現的接口
Model???????????????????????????????????? 抽象業務實體/類
OracleDAL???????????????????????????? Oracle特定的DAL實現,實現了IDAL接口
Post - Build??????????????????????????? ?暫時不明白(MSDN解釋為:運行編譯后操作的項目,比如將程序集添加到 GAC 或 COM+)
Pre? - Build?? ?暫時不明白(MSDN解釋為:將程序集從 GAC 刪除或從 COM+ 注銷程序集的項目)
SQLServerDAL????????????????????? SQLServer特定的DAL實現,實現了IDAL接口
Utility????????????????????????????????????? 一組幫助類
Web?????????????????????????????????????? Web頁和控件
解決方案項 用來構建應用程序的雜項,比如用來簽署應用程序程序集的 Pet Shop.snk 密鑰文件
PetShop作為一個經典的例子,所以我希望把它分析得體無完膚,分功能/細節分析/問題/啟發四個部分.
3.1 Model 項目
功能:
1.抽象出業務實體,這個是一個設計人員建模的過程,把系統中的實體抽象成為一個"瘦數據"類
2.都是一些屬性的設置,用于在各個層里傳輸數據,可以被認為是數據容器.
細節分析:
1.AccountInfo.cs 客戶的相關信息;與表Account和SignOn對應;該類只可以獲取它的屬性,而不能更改屬性;在該類中定義了一個AddressInfo的對象,這樣一來就可以很全面地描述了Account表.
2.AddressInfo.cs 客戶的相關信息;與表Account對應;該類可以獲取和設置它的屬性.
3.CardItemInfo.cs 定義購物車的列表,與表item相關.
4.CreaditCardInfo.cs 信用卡相關信息;與表order相關.
5.ItemInfo.cs 產品的詳細信息;與表Item對應.
6.LineItemInfo.cs 定單中具體某種商品的信息;與表LineItem相關.
7.OrderInfo.cs 定單所有商品的信息;與表Order對應;該類定義了CardItemInfo, AddressInfo, LineItemInfo對象,這樣一來就可以把整個定單的信息全部描述清楚了.
8.ProductInfo.cs 產品的信息;與表Product對應.
9.仔細看Model里的每個類都有"[Serializable]",指示該類可以序列化,但是沒法繼承該類.System.Serializable.
問題:
1.究竟以什么為根據來判別各個類的屬性可讀或者可寫?
2.類可以序列化有什么作用?
3.在這些類中都是設置私有字段,而且在構造函數里初始化這些字段,然后通過屬性去讀取或者寫.這樣有多少個私有變量就重構一個參數個數相同的構造函數.
4.在OrderInfo類中,為什么定義了兩個AddressInfo對象?從表面上來上一個作為:_billingAddress,另外一個:_shippingAddress,我個人認為只要定義了一個對象,那就可以了,在思考中....
5.建模的時候應該采用什么方法比較好?看來我應該好好回味軟件工程的方法了.
啟發:
1.以后對一個項目設計首先抽象出所有的實體
2.對一個實體的屬性定義還應該包含屬性的組合因素項.同樣一個實體可能通過其他的實體對象才能真正完美地描述.
3.2 IDAL項目
功能
1. IDAL里的各個類的劃分依據是根據數據庫操作來劃分的,將業務邏輯和數據庫操作分離開.
2. 這是一組類的接口,定義了各種類型的數據庫公共的數據訪問方法,使得產品數據移植性良好,當需要使用別的數據庫的時候,不需要更改任何的業務邏輯就可以實現了.
3. OracleDAL 和SQLServerDAL類是實現公共的IDAL定義的方法和具體的數據訪問方法,而DALFactory項是工廠模式,通過這個項根據系統的配置信息動態確定使用具體的DAL.
4. "工廠模式"的實現 : ?創建一個 C# 接口,其中對于數據庫訪問類必須公開的每個方法都要聲明一個方法。 對于每一個要支持的數據庫,都創建一個實現數據庫特定代碼的具體類,以執行接口也稱“協定”中的每一項操作。 為了支持運行時確定加載哪一個具體類,需要創建第三個類,也就是工廠類,它從配置文件中讀入一個值以確定應該使用反射加載哪一個程序集。 通過 .NET 的反射命名空間,可以加載某個特定程序集并用該程序集創建某個對象的實例。 為了使應用程序更安全,為版本控制提供更好的支持,我們可以在應用程序配置文件(也就是這里的 web.config. )中添加要加載的程序集文件的“證據”,這意味著 .NET 框架將只加載我們在編譯期間簽過名而且有正確版本號的程序集。
細節分析
1. IAccount.cs 定義了獲得客戶信息,和注冊/更新客戶信息的數據庫訪問操作接口.
2. IInventory.cs定義了獲得具體某種商品的存貨量和計算某客戶定單后某種商品的剩余存貨量的數據庫訪問操作接口.
3. IItems.cs定義了獲取某種商品種類的商品信息和獲取某商品的商品信息的數據庫訪問操作接口.
4. IOrder.cs定義了增加定單和獲取定單的數據庫訪問操作接口.
5. IProduct.cs定義了通過種類和關鍵字查詢商品的數據庫訪問操作接口.
6. IProfile.cs根據統計獲取客戶喜歡的商品圖標信息.
問題
啟發
1.如果更加有效地抽象出實體公共的數據庫操作接口?看來大學的軟件工程學得真太爛拉...我橫觀看了SQLServerDAL感觸..
3.3 SQLServerDAL 和 OracleDAL項
功能
細節分析
問題
啟發