正在學習PetShop3.x,現將一些自己的一些總結寫出來.
PetShop3.x分層分得很清楚,分別為UI,Business Layer,Data Access Layer,典型的N層體繫結構.表現的
非常棒.
但是仔細一看原始碼,發現並不是那麼簡單分清楚,原因就是在表現Data Access layer時,做了一些易於擴充的
架構,那就時原廠模式.所以為了把它搞清出,我專門選了一個功能來研究,其他的功能基本上都是一樣,大同小異了.我挑選的是Product這個.
先來一張圖:
可以看到,PetShop.Web的Catagory調用BLL層裡的Product,
代碼如下:可以在catagory.aspx.cs中找到
// Check to see if the contents are in the Data Cache
if(Cache[categoryKey] != null){
// If the data is already cached, then used the cached copy
products.DataSource = (IList)Cache[categoryKey];
}else{
// If the data is not cached, then create a new products object and request the data
Product product = new Product();
IList productsByCategory = product.GetProductsByCategory(categoryKey);
// Store the results of the call in the Cache and set the time out to 12 hours
Cache.Add(categoryKey, productsByCategory, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration , CacheItemPriority.High, null);
products.DataSource = productsByCategory;
}
而PetShop.BLL.Product的GetProductsByCategory是如何處理的呢?
看看如下代碼
public IList GetProductsByCategory(string category) {
// Return null if the string is empty
if (category.Trim() == string.Empty)
return null;
// Get an instance of the Product DAL using the DALFactory
IProduct dal = PetShop.DALFactory.Product.Create();
// Run a search against the data store
return dal.GetProductsByCategory(category);
}
上面就是其實現代碼了.我們會發現用到了了PetShop.DALFactory,這個就是原廠模式了.Create了一個IProduct的執行個體.其實
這個時候它建立的是來自PetShop.SQLServerDAL的Product類,所以調用的是PetShop.SQLServerDAL.Product.GetProductByCatagory方法,而不是PetShop.OracleDAL.Product.GetProductByCatagory.關於這個以後再來討論.
說到這裡,我想我對他的如何調用都熟悉了.