freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

petshop的系統(tǒng)架構(gòu)設(shè)計(jì)(更新版)

  

【正文】 。在為一個(gè)汽車制造商開(kāi)發(fā)一個(gè)大型系統(tǒng)時(shí),需要將數(shù)據(jù)傳遞到管理中心,并且該數(shù)據(jù)將被Oracle的EBS(EBusiness System)使用。 add key=”O(jiān)rderStrategyClass” value=”” / // Look up which strategy to use from config file 在這里,運(yùn)用了一個(gè)策略模式,類圖如下所示: } } totalOrdersProcessed++。 ((OrderInfo)queueOrders[k])。 { if ((elapsedTime + queueTimeout + transactionTimeout) ) add key=”O(jiān)rderMessaging” value=””/ 之所以利用工廠模式來(lái)負(fù)責(zé)對(duì)象的創(chuàng)建,是便于在業(yè)務(wù)層中對(duì)其調(diào)用,例如在BLL模塊中OrderAsynchronous類:public class OrderAsynchronous : IOrderStrategy{ } 從設(shè)計(jì)上來(lái)看,由于PetShop采用“面向接口設(shè)計(jì)”的原則,如果我們要?jiǎng)?chuàng)建Order對(duì)象,應(yīng)該采用如下的方式: PetShopQueue queue = new Order()。 所以,最后的類圖應(yīng)該如下: public void Send(OrderInfo orderMessage) // This method involves in distributed transaction and need Automatic Transaction type public class Order:PetShopQueue, MSMQ隊(duì)列是一個(gè)可持久的隊(duì)列,因此不必?fù)?dān)心用戶不間斷地下訂單會(huì)導(dǎo)致訂單數(shù)據(jù)的丟失。 throw。 throw new TimeoutException()。 using (Message message = (timeout, transactionType))解決性能的瓶頸,除了對(duì)硬件系統(tǒng)進(jìn)行升級(jí)外,軟件設(shè)計(jì)的合理性尤為重要。return (orderStategyPath).CreateInstance(fullPath)。return (orderPath).CreateInstance(fullPath)。return (dalPath).CreateInstance(fullPath)。private static readonly string orderStategyPath = [”O(jiān)rderStrategyAssembly”]。也就是說(shuō),我們可以為整個(gè)系統(tǒng)提供類似于“Service Locator”的實(shí)現(xiàn):public static class ServiceLocator{public static CreateOrder()“依賴注入”的功能通常是用專門的IoC容器提供的,在Java平臺(tái)下,這樣的容器包括Spring,PicoContainer等。標(biāo)準(zhǔn)的抽象工廠模式類圖如下:至少,那些在數(shù)據(jù)訪問(wèn)層中占據(jù)了絕大部分的CRUD操作,通過(guò)利用ORM框架,我們就僅需要付出極少數(shù)時(shí)間和精力來(lái)解決它們了。()。 finally 不過(guò)前提是,我們需要為它提供專門的SQL語(yǔ)句管理工具。如果使用了存儲(chǔ)過(guò)程,出于安全的考慮,必須有專門的DBA重新運(yùn)行存儲(chǔ)過(guò)程的腳本,部署的方式受到了限制。此外,由于Oracle使用的是PLSQL,而SQL Server和Sybase等使用的是TSQL,兩者雖然都遵循了標(biāo)準(zhǔn)SQL的語(yǔ)法,但在很多細(xì)節(jié)上仍有區(qū)別,如果將SQL語(yǔ)句大量的使用到程序中,無(wú)疑為可能的數(shù)據(jù)庫(kù)移植也帶來(lái)了困難。此外,PetShop還專門為SQL Server和Oracle提供了抽象的Helper類,包裝了一些常用的操作,如ExecuteNonQuery、ExecuteReader等方法。其次,它體現(xiàn)了“抽象”的精神,或者說(shuō)是“面向接口編程”的最佳體現(xiàn)。雖然這些類的屬性分別映射了數(shù)據(jù)表的列,而每一個(gè)對(duì)象實(shí)例也恰恰對(duì)應(yīng)于數(shù)據(jù)表的每一行,但這些實(shí)體類卻并不具備對(duì)應(yīng)的數(shù)據(jù)庫(kù)訪問(wèn)能力。 Pattern — bruce zhang 1:50 pm 《解剖PetShop》系列之二二、PetShop數(shù)據(jù)訪問(wèn)層之?dāng)?shù)據(jù)庫(kù)訪問(wèn)設(shè)計(jì)在系列一中,我從整體上分析了PetShop的架構(gòu)設(shè)計(jì),并提及了分層的概念。雖然在IBLLStrategy模塊中,僅僅是簡(jiǎn)單的IOrderStategy,但同時(shí)也給出了一個(gè)范例和信息,那就是在業(yè)務(wù)邏輯的處理中,如果存在業(yè)務(wù)操作的多樣化,或者是今后可能的變化,均應(yīng)利用抽象的原理。此外,抽象出來(lái)的IDAL模塊,除了解除了向下的依賴之外,對(duì)于其上的業(yè)務(wù)邏輯層,同樣僅存在弱依賴關(guān)系,如下圖所示:圖七:業(yè)務(wù)邏輯層的模塊結(jié)構(gòu)圖圖七中BLL是業(yè)務(wù)邏輯層的核心模塊,它包含了整個(gè)系統(tǒng)的核心業(yè)務(wù)。在數(shù)據(jù)訪問(wèn)層(DAL)中,仍然采用DAL Interface抽象出數(shù)據(jù)訪問(wèn)邏輯,并以DAL Factory作為數(shù)據(jù)訪問(wèn)層對(duì)象的工廠模塊。這種修改尤其體現(xiàn)在自上而下的方向。每個(gè)功能模塊一旦定義好統(tǒng)一的接口,就可以被各個(gè)模塊所調(diào)用,而不用為相同的功能進(jìn)行重復(fù)地開(kāi)發(fā)。一個(gè)好的分層式結(jié)構(gòu),可以使得開(kāi)發(fā)人員的分工更加明確。以PetShop為例,業(yè)務(wù)邏輯層的相關(guān)設(shè)計(jì),均和網(wǎng)上寵物店特有的邏輯相關(guān),例如查詢寵物,下訂單,添加寵物到購(gòu)物車等等。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或成為領(lǐng)域?qū)樱?、表示層,如圖所示:圖一:三層的分層式結(jié)構(gòu)數(shù)據(jù)訪問(wèn)層:有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。每個(gè)開(kāi)發(fā)人員的任務(wù)得到了確認(rèn),開(kāi)發(fā)進(jìn)度就可以迅速的提高。而層與層之間的通信也必然保證了接口的標(biāo)準(zhǔn)化。標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)如下圖所示:圖二:.Net中標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)隨著PetShop版本的更新,其分層式結(jié)構(gòu)也在不斷的完善,就沒(méi)有采用標(biāo)準(zhǔn)的三層式結(jié)構(gòu),如圖三:圖三:PetShop 從圖中我們可以看到,并沒(méi)有明顯的數(shù)據(jù)訪問(wèn)層設(shè)計(jì)。其詳細(xì)的模塊結(jié)構(gòu)圖如下所示:圖六:數(shù)據(jù)訪問(wèn)層的模塊結(jié)構(gòu)圖可以看到,在數(shù)據(jù)訪問(wèn)層中,完全采用了“面向接口編程”思想。既然與具體的數(shù)據(jù)訪問(wèn)邏輯無(wú)關(guān),則層與層之間的關(guān)系就是松散耦合的。也正因?yàn)榇?,PetShop將核心的業(yè)務(wù)邏輯都放到了一個(gè)模塊BLL中,并沒(méi)有將具體的實(shí)現(xiàn)和抽象嚴(yán)格的按照模塊分開(kāi)。在系列二中,我將介紹有關(guān)數(shù)據(jù)庫(kù)訪問(wèn)的設(shè)計(jì)。這里所指的業(yè)務(wù)邏輯,并非業(yè)務(wù)邏輯層意義上的領(lǐng)域(domain)業(yè)務(wù)邏輯(從這個(gè)意義上,我更傾向于將業(yè)務(wù)邏輯層稱為“領(lǐng)域邏輯層”),一般意義上說(shuō),這些業(yè)務(wù)邏輯即為基本的數(shù)據(jù)庫(kù)操作,包括Select,Insert,Update和Delete。在PetShop中,可以支持SQL Server和Oracle,那么它們具體的實(shí)現(xiàn)就分別放在兩個(gè)不同的模塊SQLServerDAL、OracleDAL中。此外,Helper類中的方法均為static方法,以利于調(diào)用。但這種方式仍然有缺陷。這種做法近似于存儲(chǔ)過(guò)程的調(diào)用,但卻避免了部署上的問(wèn)題。因?yàn)镺RM框架已經(jīng)為數(shù)據(jù)訪問(wèn)提供了基本的Select,Insert,Update和Delete操作了。 ITransaction trans = null。( order)。 {現(xiàn)在我們已經(jīng)有了數(shù)據(jù)實(shí)體,數(shù)據(jù)對(duì)象的抽象接口和實(shí)現(xiàn),可以說(shuō)有關(guān)數(shù)據(jù)庫(kù)訪問(wèn)的主體就已經(jīng)完成了。要考慮到數(shù)據(jù)庫(kù)的可移植性,則factory必須作為一個(gè)全局變量,并在主程序運(yùn)行時(shí)被實(shí)例化。然而,當(dāng)我們利用配置文件和反射功能時(shí),具體工廠的創(chuàng)建就顯得有些“畫(huà)蛇添足”了,我們完全可以在配置文件中,直接指向具體的數(shù)據(jù)庫(kù)對(duì)象實(shí)現(xiàn)類。{{{//……}那么和所謂“依賴注入”相關(guān)的代碼都可以利用ServiceLocator來(lái)完成。 PetShop數(shù)據(jù)訪問(wèn)層之消息處理PetShop數(shù)據(jù)訪問(wèn)層之消息處理Filed under: Design amp。 由于在PetShop中僅對(duì)訂單的處理使用了異步處理方式,因此在消息接口IMessaging中,僅定義了一個(gè)IOrder接口,其類圖如下: try { (msg, transactionType)。 方法的實(shí)現(xiàn)代碼如下: } { IOrder order = new Order()。 考慮到IOrder的實(shí)現(xiàn)有可能的變化,PetShop仍然利用了工廠模式,將IOrder對(duì)象的創(chuàng)建用專門的工廠模塊進(jìn)行了封裝: path的值通過(guò)配置文件獲?。?OrderProcessor是一個(gè)控制臺(tái)應(yīng)用程序,不過(guò)可以根據(jù)需求將其設(shè)計(jì)為Windows Service。 for (int j = 0。 j = batchSize。 elapsedTime = new TimeSpan().TotalSeconds 。 j = batchSize。 首先,()來(lái)獲取消息隊(duì)列中的訂單數(shù)據(jù),并將其放入到一個(gè)ArrayList對(duì)象中。 string path = [”O(jiān)rderStrategyAssembly”]。 // Using the evidence given in the config file load the appropriate assembly and class分布式處理中,一個(gè)重要的技術(shù)要素就是有關(guān)消息的處理,已經(jīng)提供了Message類,可以用于承載消息的傳遞,前提上消息的發(fā)送方與接收方在數(shù)據(jù)定義上應(yīng)有統(tǒng)一的接口規(guī)范。然后利用IBM的EAI技術(shù)(企業(yè)應(yīng)用集成,Enterprise Application Itegration)定期將文件服務(wù)器中的文件,利用接口規(guī)范寫(xiě)入到EAI數(shù)據(jù)庫(kù)服務(wù)器中,并最終寫(xiě)道EBS的Oracle數(shù)據(jù)庫(kù)中。在CPU以及主板的芯片中,都引入了這種名為高速緩沖存儲(chǔ)器(Cache)的技術(shù)。 Framework中。但我們也可以通過(guò)代碼編寫(xiě)的方式顯式的移除相關(guān)的數(shù)據(jù)項(xiàng):(”First”)。它主要包含兩個(gè)參數(shù):Duration和VaryByParam。引入緩存看來(lái)是提高性能的“完美”解決方案,然而“金無(wú)足赤,人無(wú)完人”,緩存機(jī)制也有缺點(diǎn),那就是數(shù)據(jù)過(guò)期的問(wèn)題。 SqlCacheDependency特性。 當(dāng)使用windows集成驗(yàn)證時(shí),使用該功能;d以上面的命令為例,說(shuō)明將對(duì)名為MSPetShop4的數(shù)據(jù)庫(kù)采用SqlCacheDependency功能,且SQL Server采用了windows集成驗(yàn)證方式。 EXEC N’Product’END其中,AspNet_SqlCacheUpdateChangeIdStoredProcedure即是工具添加的一組存儲(chǔ)過(guò)程中的一個(gè)。GO無(wú)疑,這是非常糟糕的結(jié)果。實(shí)現(xiàn)這一技術(shù)的核心是SqlCacheDependency類,它繼承了CacheDependency類。由于PetShop需要為Category、Product和Item數(shù)據(jù)表建立依賴項(xiàng),因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回建立了這些依賴項(xiàng)的AggregateCacheDependency對(duì)象。 protected char[] configurationSeparator = new char[] { ‘,’ }。 protected TableDependency(string configKey)然而不管是創(chuàng)建SqlCacheDependency對(duì)象,還是自定義的CacheDependency對(duì)象,都是將這些依賴項(xiàng)添加到AggregateCacheDependency類中,因而我們也可以為自定義CacheDependency建立專門的類,只要實(shí)現(xiàn)IPetShopCacheDependency接口即可。 public static IPetShopCacheDependency CreateProductDependency() }}整個(gè)工廠模式的實(shí)現(xiàn)如圖43所示:就好像提供一個(gè)統(tǒng)一的門面一般,將內(nèi)部的子系統(tǒng)封裝起來(lái),統(tǒng)一為一個(gè)高層次的接口。 public static AggregateCacheDependency GetProductDependency() return null。 } return ().GetDependency()。 else比起直接調(diào)用DependencyAccess類的GetDependency()方法而言,除了方法更簡(jiǎn)單之外,同時(shí)它還對(duì)CacheDependencyAssembly配置節(jié)進(jìn)行了判斷,如果其值為空,則返回null對(duì)象。 // 檢查緩存中是否存在該數(shù)據(jù)項(xiàng)。 // 。 return data。 {當(dāng)我們操作增加了緩存機(jī)制的業(yè)務(wù)對(duì)象時(shí),對(duì)于調(diào)用者而言,應(yīng)與BLL業(yè)務(wù)對(duì)象的調(diào)用保持一致。 if (data == null) (key, data, cd, (productTimeout), , , null)。 }此外,如果需要考
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1