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

正文內(nèi)容

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

  

【正文】 (key, data, cd, (productTimeout), , , null)。 if (data == null)當(dāng)我們操作增加了緩存機(jī)制的業(yè)務(wù)對(duì)象時(shí),對(duì)于調(diào)用者而言,應(yīng)與BLL業(yè)務(wù)對(duì)象的調(diào)用保持一致。 { // 。 return ().GetDependency()。 return null。就好像提供一個(gè)統(tǒng)一的門面一般,將內(nèi)部的子系統(tǒng)封裝起來(lái),統(tǒng)一為一個(gè)高層次的接口。 protected TableDependency(string configKey)由于PetShop需要為Category、Product和Item數(shù)據(jù)表建立依賴項(xiàng),因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回建立了這些依賴項(xiàng)的AggregateCacheDependency對(duì)象。實(shí)現(xiàn)這一技術(shù)的核心是SqlCacheDependency類,它繼承了CacheDependency類。GO EXEC N’Product’END其中,AspNet_SqlCacheUpdateChangeIdStoredProcedure即是工具添加的一組存儲(chǔ)過(guò)程中的一個(gè)。以上面的命令為例,說(shuō)明將對(duì)名為MSPetShop4的數(shù)據(jù)庫(kù)采用SqlCacheDependency功能,且SQL Server采用了windows集成驗(yàn)證方式。引入緩存看來(lái)是提高性能的“完美”解決方案,然而“金無(wú)足赤,人無(wú)完人”,緩存機(jī)制也有缺點(diǎn),那就是數(shù)據(jù)過(guò)期的問(wèn)題。但我們也可以通過(guò)代碼編寫的方式顯式的移除相關(guān)的數(shù)據(jù)項(xiàng):(”First”)。然后利用IBM的EAI技術(shù)(企業(yè)應(yīng)用集成,Enterprise Application Itegration)定期將文件服務(wù)器中的文件,利用接口規(guī)范寫入到EAI數(shù)據(jù)庫(kù)服務(wù)器中,并最終寫道EBS的Oracle數(shù)據(jù)庫(kù)中。分布式處理中,一個(gè)重要的技術(shù)要素就是有關(guān)消息的處理,已經(jīng)提供了Message類,可以用于承載消息的傳遞,前提上消息的發(fā)送方與接收方在數(shù)據(jù)定義上應(yīng)有統(tǒng)一的接口規(guī)范。 string path = [”O(jiān)rderStrategyAssembly”]。 首先,()來(lái)獲取消息隊(duì)列中的訂單數(shù)據(jù),并將其放入到一個(gè)ArrayList對(duì)象中。 j = batchSize。 j = batchSize。 IOrder order = new Order()。 { } 方法的實(shí)現(xiàn)代碼如下: (msg, transactionType)。 { 由于在PetShop中僅對(duì)訂單的處理使用了異步處理方式,因此在消息接口IMessaging中,僅定義了一個(gè)IOrder接口,其類圖如下:{{然而,當(dāng)我們利用配置文件和反射功能時(shí),具體工廠的創(chuàng)建就顯得有些“畫蛇添足”了,我們完全可以在配置文件中,直接指向具體的數(shù)據(jù)庫(kù)對(duì)象實(shí)現(xiàn)類。現(xiàn)在我們已經(jīng)有了數(shù)據(jù)實(shí)體,數(shù)據(jù)對(duì)象的抽象接口和實(shí)現(xiàn),可以說(shuō)有關(guān)數(shù)據(jù)庫(kù)訪問(wèn)的主體就已經(jīng)完成了。 {( order)。 ITransaction trans = null。這種做法近似于存儲(chǔ)過(guò)程的調(diào)用,但卻避免了部署上的問(wèn)題。此外,Helper類中的方法均為static方法,以利于調(diào)用。這里所指的業(yè)務(wù)邏輯,并非業(yè)務(wù)邏輯層意義上的領(lǐng)域(domain)業(yè)務(wù)邏輯(從這個(gè)意義上,我更傾向于將業(yè)務(wù)邏輯層稱為“領(lǐng)域邏輯層”),一般意義上說(shuō),這些業(yè)務(wù)邏輯即為基本的數(shù)據(jù)庫(kù)操作,包括Select,Insert,Update和Delete。也正因?yàn)榇?,PetShop將核心的業(yè)務(wù)邏輯都放到了一個(gè)模塊BLL中,并沒(méi)有將具體的實(shí)現(xiàn)和抽象嚴(yán)格的按照模塊分開。其詳細(xì)的模塊結(jié)構(gòu)圖如下所示:圖六:數(shù)據(jù)訪問(wèn)層的模塊結(jié)構(gòu)圖可以看到,在數(shù)據(jù)訪問(wèn)層中,完全采用了“面向接口編程”思想。而層與層之間的通信也必然保證了接口的標(biāo)準(zhǔn)化。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。以PetShop為例,業(yè)務(wù)邏輯層的相關(guān)設(shè)計(jì),均和網(wǎng)上寵物店特有的邏輯相關(guān),例如查詢寵物,下訂單,添加寵物到購(gòu)物車等等。每個(gè)功能模塊一旦定義好統(tǒng)一的接口,就可以被各個(gè)模塊所調(diào)用,而不用為相同的功能進(jìn)行重復(fù)地開發(fā)。在數(shù)據(jù)訪問(wèn)層(DAL)中,仍然采用DAL Interface抽象出數(shù)據(jù)訪問(wèn)邏輯,并以DAL Factory作為數(shù)據(jù)訪問(wèn)層對(duì)象的工廠模塊。雖然在IBLLStrategy模塊中,僅僅是簡(jiǎn)單的IOrderStategy,但同時(shí)也給出了一個(gè)范例和信息,那就是在業(yè)務(wù)邏輯的處理中,如果存在業(yè)務(wù)操作的多樣化,或者是今后可能的變化,均應(yīng)利用抽象的原理。雖然這些類的屬性分別映射了數(shù)據(jù)表的列,而每一個(gè)對(duì)象實(shí)例也恰恰對(duì)應(yīng)于數(shù)據(jù)表的每一行,但這些實(shí)體類卻并不具備對(duì)應(yīng)的數(shù)據(jù)庫(kù)訪問(wèn)能力。此外,PetShop還專門為SQL Server和Oracle提供了抽象的Helper類,包裝了一些常用的操作,如ExecuteNonQuery、ExecuteReader等方法。如果使用了存儲(chǔ)過(guò)程,出于安全的考慮,必須有專門的DBA重新運(yùn)行存儲(chǔ)過(guò)程的腳本,部署的方式受到了限制。 finally至少,那些在數(shù)據(jù)訪問(wèn)層中占據(jù)了絕大部分的CRUD操作,通過(guò)利用ORM框架,我們就僅需要付出極少數(shù)時(shí)間和精力來(lái)解決它們了?!耙蕾囎⑷搿钡墓δ芡ǔJ怯脤iT的IoC容器提供的,在Java平臺(tái)下,這樣的容器包括Spring,PicoContainer等。public static CreateOrder()private static readonly string orderStategyPath = [”O(jiān)rderStrategyAssembly”]。return (orderPath).CreateInstance(fullPath)。解決性能的瓶頸,除了對(duì)硬件系統(tǒng)進(jìn)行升級(jí)外,軟件設(shè)計(jì)的合理性尤為重要。 public class Order:PetShopQueue, // This method involves in distributed transaction and need Automatic Transaction type public void Send(OrderInfo orderMessage) 所以,最后的類圖應(yīng)該如下: 從設(shè)計(jì)上來(lái)看,由于PetShop采用“面向接口設(shè)計(jì)”的原則,如果我們要?jiǎng)?chuàng)建Order對(duì)象,應(yīng)該采用如下的方式: if ((elapsedTime + queueTimeout + transactionTimeout) ) totalOrdersProcessed++。 } } // Look up which strategy to use from config file我們還可以為應(yīng)用程序緩存添加依賴項(xiàng),使得依賴項(xiàng)發(fā)生更改時(shí),該數(shù)據(jù)項(xiàng)能夠從緩存中移除:string[] dependencies = {”Second”}。這就有效地避免了因?yàn)橹档牟煌鴮?dǎo)致輸出錯(cuò)誤的數(shù)據(jù)。解決的辦法就是利用輪詢機(jī)制, Server數(shù)據(jù)庫(kù),以跟蹤數(shù)據(jù)的變化情況。 允許對(duì)數(shù)據(jù)表采用SqlCacheDependency功能;dt SET NOCOUNT ON} Framework ,它負(fù)責(zé)監(jiān)視依賴項(xiàng)對(duì)象的集合。 (new SqlCacheDependency(dbName, tableName))。 return dependency。類DependencyAccess即為創(chuàng)建IPetShopCacheDependency對(duì)象的工廠類:public static class DependencyAccess{ {在PetShop ,是通過(guò)引入Facade模式以方便調(diào)用者更加簡(jiǎn)單地獲得AggregateCacheDependency類型對(duì)象。 return ().GetDependency()。 string data = (string)[cacheKey]。 (cacheKey, data, cd, (cacheDuration), , , null)。 protected void Page_Load(object sender, EventArgs e) }}與業(yè)務(wù)邏輯層Product對(duì)象的GetProductsByCategory()方法相比,增加了緩存機(jī)制。 } string cacheKey = (CATEGORY_NAME_KEY, categoryId)。 if (!enableCaching) return null。 if (!(path)) return LoadInstance(”Item”)。由于接口方法GetDependency()的實(shí)現(xiàn)中,返回的對(duì)象dependency是在受保護(hù)的構(gòu)造函數(shù)創(chuàng)建的,因此這里的實(shí)現(xiàn)方式也可以看作是Template Method模式的靈活運(yùn)用。 {在PetShop ,定義了名為IPetShopCacheDependency接口,它僅包含了一個(gè)接口方法:public interface IPetShopCacheDependency{如果要調(diào)用表41中所示的相關(guān)方法,需要注意的是訪問(wèn)SQL Server數(shù)據(jù)庫(kù)的帳戶必須具有創(chuàng)建表和存儲(chǔ)過(guò)程的權(quán)限。Database=MSPetShop4″。字段tableName記錄要追蹤的數(shù)據(jù)表的名稱,例如在PetShop ,要記錄的數(shù)據(jù)表就包括Category、Item和Product。以PetShop ,數(shù)據(jù)庫(kù)名為MSPetShop4,則命令為:aspnet_regsql S localhost E d MSPetShop4 ed以下是該工具的命令參數(shù)說(shuō)明:?那么我們是否應(yīng)該為了追求高性能,而不顧所謂“數(shù)據(jù)過(guò)期”所帶來(lái)的隱患呢?顯然,在類似于股票系統(tǒng)這種數(shù)據(jù)更新頻繁的特定場(chǎng)景下,數(shù)據(jù)過(guò)期的糟糕表現(xiàn)甚至比低效的性能更讓人難以接受。例如,在一個(gè)電子商務(wù)網(wǎng)站里,用戶需要經(jīng)常查詢商品信息,這個(gè)過(guò)程會(huì)涉及到數(shù)據(jù)庫(kù)訪問(wèn)以及搜索條件的匹配,在數(shù)據(jù)量較大的情況下,如此的搜索過(guò)程是較為耗時(shí)的。應(yīng)用程序緩存其實(shí)現(xiàn)原理說(shuō)來(lái)平淡無(wú)奇。 k++) } // exit loop ArrayList queueOrders = new ArrayList()。 public void Insert( order){ public new OrderInfo Receive() 在對(duì)消息接口的實(shí)現(xiàn)中,考慮到未來(lái)的擴(kuò)展中會(huì)有其他的數(shù)據(jù)對(duì)象會(huì)使用MSMQ,因此定義了一個(gè)Queue的基類,實(shí)現(xiàn)消息Receive和Send的基本操作:public virtual object Receive(){而在軟件設(shè)計(jì)上,比較有用的方式是利用多線程與異步處理方式。 return ()ServiceLocator. LocateDALOrderObject(”O(jiān)rder”)。 }}在PetShop中,這種依賴配置文件和反射創(chuàng)建對(duì)象的方式極其常見,包括IBLLStategy、CacheDependencyFactory等等。之所以能用這個(gè)類達(dá)到抽象工廠的目的,是因?yàn)榕渲梦募头瓷涞倪\(yùn)用,如下的代碼片斷所示:public sealed class DataAccess{也就是說(shuō),創(chuàng)建的對(duì)象有多種類別,而每種類別又有不同的實(shí)現(xiàn),這是典型的抽象工廠模式的應(yīng)用場(chǎng)景。不過(guò),利用良好的設(shè)計(jì),我們可以為各種業(yè)務(wù)提供不同的表來(lái)存放SQL語(yǔ)句。在早期的CS結(jié)構(gòu)中,由于未采用三層式架構(gòu)設(shè)計(jì),數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)邏輯層是緊密糅合在一起的,因此,SQL語(yǔ)句遍布與系統(tǒng)的每一個(gè)角落。首先,它體現(xiàn)了“職責(zé)分離”的原則。這些特殊的模塊,我會(huì)在此后的文章中詳細(xì)介紹。SQLServerDAL和OracleDAL模塊均實(shí)現(xiàn)IDAL模塊的接口,其中包含的邏輯就是對(duì)數(shù)據(jù)庫(kù)的Select,Insert,Update和Delete操作。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過(guò)中間層來(lái)完成。分層式結(jié)構(gòu)究竟其優(yōu)勢(shì)何在?Martin Fowler在《Patterns of Enterprise Application Architecture》一書中給出了答案:開發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);可以降低層與層之間的依賴;有利于標(biāo)準(zhǔn)化;利于各層邏輯的復(fù)用。如果要加入ORM的元素,那么就會(huì)包括對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化。如果一個(gè)系統(tǒng)沒(méi)有分層,那么各自的邏輯都緊緊糾纏在一起,彼此間相互依賴,誰(shuí)都是不可替換的。一旦要求支持的數(shù)據(jù)庫(kù)發(fā)生變化,或者需要修改數(shù)據(jù)訪問(wèn)的邏輯,由于沒(méi)有清晰的分層,會(huì)導(dǎo)致項(xiàng)目作大的修改。畢竟,具體實(shí)現(xiàn)的SQLServerDAL和OracalDAL根本就與業(yè)務(wù)邏輯層沒(méi)有半點(diǎn)關(guān)系。它們沒(méi)有行為,僅用于表現(xiàn)對(duì)象的數(shù)據(jù)。從數(shù)據(jù)庫(kù)的實(shí)現(xiàn)來(lái)看,PetShop體現(xiàn)出了沒(méi)有ORM框架的臃腫與丑陋。雖然有相應(yīng)的調(diào)試工具,但比起對(duì)代碼的調(diào)試而言,仍然比較復(fù)雜且不方便。trans = ()。 }此外,這樣的設(shè)計(jì)
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1