溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

《.NET應(yīng)用架構(gòu)設(shè)計(jì):原則、模式與實(shí)踐》新書博客--試讀-2.1.2 設(shè)計(jì)原則實(shí)戰(zhàn)

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI