中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰

發布時間:2020-05-12 01:00:50 來源:網絡 閱讀:929 作者:yanyangtian 欄目:編程語言
2.1.2  設計原則實戰
 
    下面我們就以一個簡單的電子商務系統為背景:通過給定的產品分類ID獲取該分類下的所有產品。
對于這個問題,基本上不用想就可以實現,如圖2-1的類圖設計。
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
 
2-1  獲取分類產品的類圖
 
其中:
q  ProductService類被客戶程序調用,通過調用GetAllProductsFrom方法來獲取產品,并且此處還可以添加緩存策略或異常處理等機制。
 
q  Product類代表了產品的實體。
 
q  ProductRepository類用來從數據存儲設備(數據庫或XML等其他數據存儲器)中讀取產品信息。     
 
注意  為了減少讀者不必要的麻煩,讓理解更加直觀,以后的章節中,都會給出完整的代碼示例和項目圖示。
在這個示例中,Visual Studio項目的結構圖如圖2-2所示。
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
2-2  Visual Studio解決方案圖
 
 
    正如之前所說:ProductService提供外部調用的方法接口,并且采用了緩存策略和異常處理機制,來提高程序的性能和健壯性,代碼如下所示:
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using System;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 usingSystem.Collections.Generic;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 usingSystem.Web;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Repository;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Domain;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 namespace AgileSharp.Chapter2.Service
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public class ProductService
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         private ProductRepository productRepository = null;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public ProductService()
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 productRepository = new ProductRepository();
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public List<Product> GetAllProductsFrom(intcategoryId)
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         List<Product> result = new List<Product>();
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 try
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                 string cacheKey = string.Format("products_in_category_{0}",categoryId);
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 result = HttpContext.Current.Cache.Get(cacheKey) as List<Product>;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 if (result == null)
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         result = productRepository.GetProductsFrom(categoryId);
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         if (result != null &&result.Count> 0)
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                             {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         HttpContext.Current.Cache.Insert(cacheKey, result);
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                             }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                 }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 catch (Exception ex)
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                                 //Log will add here later
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 return result;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 }
 
    至于ProductProductRepository的代碼就非常簡單了,這里不多解釋。
 
示例到這里,也許大家有個疑問:上面的代碼有些什么問題?
 
q  ProductService依賴于ProductRepository。在沒有任何變化的情況下,這沒有什么問題。但是如果現在項目換了數據存儲設備,例如將數據庫換成了XML文件,或者數據庫的訪問技術從ADO.NET 換成了Entity Framework,那么ProductRepository的代碼就得改變,這會使得整個項目都需要重新編譯,重新部署。問題來了:此時系統中只有ProductRepository一個變化點,為什么非得要求整個項目重新編譯,重新部署呢?難道不能只重新編譯和部署那個變化的模塊呢?
 
q  代碼不具有測試性能。要想知道此段功能代碼是否按照了我們的意愿運行,可以通過人工審核,然后通過GUI界面獲取數據來進行調試,此時的邏輯相對而言比較簡單,此方法也還行得通。不過,一旦業務邏輯變得復雜或代碼量的劇增,那么很難確保代碼不會出錯,而這些錯誤很多時候只會在運行時才能被發現。
 
q  緩存機制依賴于HttpContext,這不僅僅會讓測試產生困難(盡管可以有Mock),而且會對后續系統的擴展有阻礙(例如采用分布式緩存)。
 
對以上的問題進行進一步分析,可以知道,這都是因為違背了以下設計原則:
 
q  ProductService依賴了ProductRepository的具體實現,而ProductRepository是一個可能的變化點。也就是說:ProductService這個高層模塊依賴了ProductRepository底層模塊,違背了依賴倒置原則,這也就使得一個ProductRepository變化,整個項目都需要重新編譯,重新部署。同理,緩存機制也是。
 
q  對于可測試性的問題,嚴格來說,上面的代碼是可以測試的,但是測試的時候必須依賴于外部的數據存儲設備,例如數據庫,那么測試的結果可能會由于數據的變動而不一樣,而且每次測試所花的時間也會比較長。
 
接下來嘗試重構上面的代碼,讓代碼的組織方式更加的靈活和易于擴展。
 
    既然上面代碼主要是違背了DIP依賴倒置原則(再次回顧一下DIP:依賴抽象,而不依賴具體實現)。
 
    那么現在就提出接口IProductRepository,使得ProductService依賴這個接口,代碼如下:
 
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using System.Collections.Generic;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Domain;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 namespace AgileSharp.Chapter2.Repository
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public interface IProductRepository
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 List<Product> GetProductsFrom(intcategoryId);    
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 }
   
    現在接口已經抽象出來了,ProductService可以直接依賴接口了,但是我們現在還需要一個實現IProductRepository接口的類ProductRepository,然后再采用LSP(里氏替換原則),用ProductRepository替換。代碼如下:
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using System;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 usingSystem.Collections.Generic;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Domain;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 namespace AgileSharp.Chapter2.Repository
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public class ProductRepository:IProductRepository
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰          //…
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 }
    現在ProductService的代碼如下所示:
 
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using System;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 usingSystem.Collections.Generic;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 usingSystem.Web;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Repository;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 using AgileSharp.Chapter2.Domain;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 namespace AgileSharp.Chapter2.Service
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public class ProductService
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         privateIProductRepositoryproductRepository = null;
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         publicProductService()
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 productRepository = new ProductRepository();
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                 }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         public List<Product> GetAllProductsFrom(intcategoryId)
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰              {
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰                      //...
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰              }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰         }
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰
《.NET應用架構設計:原則、模式與實踐》新書博客--試讀-2.1.2 設計原則實戰 }
    其實可以看到,上面ProductService的代碼雖然提出了抽象接口,但問題依然存在:仍依賴于ProductRepository的具體實現。
 
    問題到這里就好辦了,可以采用工廠模式,通過讀取配置文件進行反射或采用依賴注入等方法得到解耦。
 
    可以看出:設計原則解決了變化點的問題,將ProductRepository這個變化點從ProductService中移出,然后一步步的遷移,最后把這個變化點引到了配置文件中,也就是將變化點引到了系統之外,也許這些正是我們需要的。
 
    當當網:http://product.dangdang.com/product.aspx?product_id=22574513
    京東地址:http://book.360buy.com/10893935.html
    卓越地址:http://www.amazon.cn/mn/dp/B006NS2N0S
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青州市| 巴青县| 尚义县| 页游| 东平县| 普安县| 东乡族自治县| 莲花县| 威远县| 孝感市| 宜阳县| 汝阳县| 星子县| 桑日县| 抚顺市| 佛山市| 忻州市| 永兴县| 离岛区| 大埔县| 中牟县| 六盘水市| 泰顺县| 桃园县| 灵山县| 台南县| 榆社县| 太谷县| 赣州市| 阜阳市| 会泽县| 博客| 杭锦后旗| 辽宁省| 两当县| 民丰县| 靖边县| 岗巴县| 武山县| 临颍县| 潍坊市|