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