锘??xml version="1.0" encoding="utf-8" standalone="yes"?> DBUtility 鏁版嵁搴撹闂粍浠跺熀紜綾?/p>
浜屻侀」鐩紩鐢ㄥ叧緋?br />
1銆乄eb 寮曠敤 BLL銆?br />
2銆丅LL 寮曠敤 IDAL錛孧odel錛屼嬌鐢―ALFactory鍒涘緩瀹炰緥銆?br />
3銆両DAL 寮曠敤 Model銆?br />
4銆丮odel 鏃犲紩鐢ㄣ?br />
5銆丏ALFactory 寮曠敤IDAL錛岄氳繃璇誨彇web.config閲岃緗殑紼嬪簭闆嗭紝鍔犺澆綾葷殑瀹炰緥錛岃繑鍥炵粰BLL浣跨敤銆?br />
6銆丼QLServerDAL 寮曠敤 Model鍜孖DAL錛岃DALFactory鍔犺澆鐨勭▼搴忛泦錛屽疄鐜版帴鍙i噷鐨勬柟娉曘? 娉ㄦ剰錛?br />
1銆亀eb.config閲岀殑紼嬪簭闆嗗悕縐板繀欏諱笌SQLServerDAL閲岀殑杈撳嚭紼嬪簭闆嗗悕縐頒竴鑷淬?br />
2銆丏ALFactory閲屽彧闇瑕佷竴涓狣ataAccess綾伙紝鍙互瀹屾垚鍒涘緩鎵鏈夌殑紼嬪簭闆嗗疄渚嬨?br />
3銆侀」鐩垱寤哄悗錛屾敞鎰忎慨鏀瑰悇欏圭洰鐨勯粯璁ゅ懡鍚嶇┖闂村拰紼嬪簭闆嗗悕縐般?br />
4銆佹敞鎰忎慨鏀硅В鍐蟲(chóng)柟妗堥噷鐨勯」鐩緷璧栥?br />
5銆佹敞鎰忓湪瑙e喅鏂規(guī)閲屽鍔犲悇欏圭洰寮曠敤銆?/p>
4.3.1 CacheDependency鎺ュ彛 PetShop 4.0寮曞叆浜?jiǎn)SqlCacheDependency鐗規(guī)э紝瀵笴ategory銆丳roduct鍜孖tem鏁版嵁琛ㄥ搴旂殑緙撳瓨瀹炴柦浜?jiǎn)SQL Cache Invalidation鎶鏈傚綋瀵瑰簲鐨勬暟鎹〃鏁版嵁鍙戠敓鏇存敼鍚庯紝璇ユ妧鏈兘澶熷皢鐩稿叧欏逛粠緙撳瓨?shù)腑绉婚櫎銆傚疄鐜拌繖涓鎶鏈殑鏍稿績(jī)鏄疭qlCacheDependency綾伙紝瀹冪戶鎵夸簡(jiǎn)CacheDependency綾匯傜劧鑰屼負(fù)浜?jiǎn)淇濊瘉鏁翠釜鏋舵瀯鐨勫彲鎵╁睍鎬э紝鎴戜滑涔熷厑璁歌璁¤呭緩绔嬭嚜瀹氫箟鐨凜acheDependency綾伙紝鐢ㄤ互鎵╁睍緙撳瓨?shù)緷璧栥傝繖灝辨湁蹇呰涓篊acheDependency寤虹珛鎶借薄鎺ュ彛錛屽茍鍦╳eb.config鏂囦歡涓繘琛岄厤緗?/p>
鍦≒etShop 4.0鐨勫懡鍚嶇┖闂碢etShop.ICacheDependency涓紝瀹氫箟浜?jiǎn)鍚嶄负IPetShopCacheDependency鎺ュ彛錛屽畠浠呭寘鍚簡(jiǎn)涓涓帴鍙f柟娉曪細(xì) AggregateCacheDependency鏄?Net Framework 2.0鏂板鐨勪竴涓被錛屽畠璐熻矗鐩戣渚濊禆欏瑰璞$殑闆嗗悎銆傚綋榪欎釜闆嗗悎涓殑浠繪剰涓涓緷璧栭」瀵硅薄鍙戠敓鏀瑰彉鏃訛紝璇ヤ緷璧栭」瀵硅薄瀵瑰簲鐨勭紦瀛樺璞¢兘灝嗚鑷姩縐婚櫎銆?br />
AggregateCacheDependency綾昏搗鍒頒簡(jiǎn)緇勫悎CacheDependency瀵硅薄鐨勪綔鐢紝瀹冨彲浠ュ皢澶氫釜CacheDependency瀵硅薄鐢氳嚦浜庝笉鍚岀被鍨嬬殑CacheDependency瀵硅薄涓庣紦瀛橀」寤虹珛鍏寵仈銆傜敱浜嶱etShop闇瑕佷負(fù)Category銆丳roduct鍜孖tem鏁版嵁琛ㄥ緩绔嬩緷璧栭」錛屽洜鑰孖PetShopCacheDependency鐨勬帴鍙f柟娉旼etDependency()鍏剁洰鐨勫氨鏄繑鍥炲緩绔嬩簡(jiǎn)榪欎簺渚濊禆欏圭殑AggregateCacheDependency瀵硅薄銆?/p>
4.3.2 CacheDependency瀹炵幇 CacheDependency鐨勫疄鐜版鏄負(fù)Category銆丳roduct鍜孖tem鏁版嵁琛ㄥ緩绔嬩簡(jiǎn)瀵瑰簲鐨凷qlCacheDependency綾誨瀷鐨勪緷璧栭」錛屽浠g爜鎵紺猴細(xì) protected AggregateCacheDependency dependency = new AggregateCacheDependency(); foreach (string tableName in tables) 闇瑕佸緩绔嬩緷璧栭」鐨勬暟鎹簱涓庢暟鎹〃閮介厤緗湪web.config鏂囦歡涓紝鍏惰緗涓嬶細(xì) 鏍規(guī)嵁鍚勪釜鏁版嵁琛ㄩ棿鐨勪緷璧栧叧緋伙紝鍥犺屼笉鍚岀殑鏁版嵁琛ㄩ渶瑕佸緩绔嬬殑渚濊禆欏逛篃鏄笉鐩稿悓鐨勶紝浠庨厤緗枃浠朵腑鐨剉alue鍊煎彲浠ョ湅鍑恒傜劧鑰屼笉綆″緩绔嬩緷璧栭」鐨勫瀵★紝鍏跺垱寤虹殑琛屼負(fù)閫昏緫閮芥槸鐩鎬技鐨勶紝鍥犺屽湪璁捐鏃訛紝鎶借薄浜?jiǎn)涓涓叡鍚岀殑綾籘ableDependency錛屽茍閫氳繃寤虹珛甯﹀弬鏁扮殑鏋勯犲嚱鏁幫紝瀹屾垚瀵逛緷璧栭」鐨勫緩绔嬨傜敱浜庢帴鍙f柟娉旼etDependency()鐨勫疄鐜頒腑錛岃繑鍥炵殑瀵硅薄dependency鏄湪鍙椾繚鎶ょ殑鏋勯犲嚱鏁板垱寤虹殑錛屽洜姝よ繖閲岀殑瀹炵幇鏂瑰紡涔熷彲浠ョ湅浣滄槸Template Method妯″紡鐨勭伒媧昏繍鐢ㄣ備緥濡俆ableDependency鐨勫瓙綾籔roduct錛屽氨鏄埄鐢ㄧ埗綾葷殑鏋勯犲嚱鏁板緩绔嬩簡(jiǎn)Product銆丆ategory鏁版嵁琛ㄧ殑SqlCacheDependency渚濊禆錛?br />
public class Product : TableDependency 濡傛灉闇瑕佽嚜瀹氫箟CacheDependency錛岄偅涔堝垱寤轟緷璧栭」鐨勬柟寮忓張鏈変笉鍚屻傜劧鑰屼笉綆℃槸鍒涘緩SqlCacheDependency瀵硅薄錛岃繕鏄嚜瀹氫箟鐨凜acheDependency瀵硅薄錛岄兘鏄皢榪欎簺渚濊禆欏規(guī)坊鍔犲埌AggregateCacheDependency綾諱腑錛屽洜鑰屾垜浠篃鍙互涓鴻嚜瀹氫箟CacheDependency寤虹珛涓撻棬鐨勭被錛屽彧瑕佸疄鐜癐PetShopCacheDependency鎺ュ彛鍗沖彲銆?/p>
4.3.3 CacheDependency宸ュ巶 緇ф壙浜?jiǎn)鎶借薄绫籘ableDependency鐨凱roduct銆丆ategory鍜孖tem綾誨潎闇瑕佸湪璋冪敤鏃跺垱寤哄悇鑷殑瀵硅薄銆傜敱浜庡畠浠殑鐖剁被TableDependency瀹炵幇浜?jiǎn)鎺ュ彛IPetShopCacheDependency錛屽洜鑰屽畠浠篃闂存帴瀹炵幇浜?jiǎn)IPetShopCacheDependency鎺ュ彛錛岃繖涓哄疄鐜板伐鍘傛ā寮忔彁渚涗簡(jiǎn)鍓嶆彁銆?/p>
鍦≒etShop 4.0涓紝渚濈劧鍒╃敤浜?jiǎn)閰嵕|枃浠跺拰鍙嶅皠鎶鏈潵瀹炵幇宸ュ巶妯″紡銆傚懡鍚嶇┖闂碢etShop.CacheDependencyFactory涓紝綾籇ependencyAccess鍗充負(fù)鍒涘緩IPetShopCacheDependency瀵硅薄鐨勫伐鍘傜被錛?br />
public static class DependencyAccess 铏界劧DependencyAccess綾誨垱寤轟簡(jiǎn)瀹炵幇浜?jiǎn)IPetShopCacheDependency鎺ュ彛鐨勭被Category銆丳roduct銆両tem錛岀劧鑰屾垜浠箣鎵浠ュ紩鍏PetShopCacheDependency鎺ュ彛錛屽叾鐩殑灝卞湪浜庤幏寰楀垱寤轟簡(jiǎn)渚濊禆欏圭殑AggregateCacheDependency綾誨瀷鐨勫璞°傛垜浠彲浠ヨ皟鐢ㄥ璞$殑鎺ュ彛鏂規(guī)硶GetDependency()錛屽涓嬫墍紺猴細(xì) 涓轟簡(jiǎn)鏂逛究璋冪敤鑰咃紝浼間箮鎴戜滑鍙互瀵笵ependencyAccess綾昏繘琛屾敼榪涳紝灝嗗師鏈夌殑CreateCategoryDependency()鏂規(guī)硶錛屼慨鏀逛負(fù)鍒涘緩AggregateCacheDependency綾誨瀷瀵硅薄鐨勬柟娉曘?/p>
鐒惰岃繖鏍風(fēng)殑鍋氭硶鎵頒貢浜?jiǎn)浣滀负宸ュ巶绫荤殑DependencyAccess鐨勬湰韜亴璐o紝涓斿垱寤篒PetShopCacheDependency鎺ュ彛瀵硅薄鐨勮涓轟粛鐒舵湁鍙兘琚皟鐢ㄨ呰皟鐢紝鎵浠ヤ繚鐣欏師鏈夌殑DependencyAccess綾諱粛鐒舵槸鏈夊繀瑕佺殑銆?/p>
鍦≒etShop 4.0鐨勮璁′腑錛屾槸閫氳繃寮曞叆Facade妯″紡浠ユ柟渚胯皟鐢ㄨ呮洿鍔犵畝鍗曞湴鑾峰緱AggregateCacheDependency綾誨瀷瀵硅薄銆?/p>
4.3.4 寮曞叆Facade妯″紡 鍒╃敤Facade妯″紡鍙互灝嗕竴浜涘鏉傜殑閫昏緫榪涜鍖呰錛屼互鏂逛究璋冪敤鑰呭榪欎簺澶嶆潅閫昏緫鐨勮皟鐢ㄣ傚氨濂藉儚鎻愪緵涓涓粺涓鐨勯棬闈竴鑸紝灝嗗唴閮ㄧ殑瀛愮郴緇熷皝瑁呰搗鏉ワ紝緇熶竴涓轟竴涓珮灞傛鐨勬帴鍙c備竴涓吀鍨嬬殑Facade妯″紡紺烘剰鍥懼涓嬫墍紺猴細(xì) Facade妯″紡鐨勭洰鐨勫茍闈炶寮曞叆涓涓柊鐨勫姛鑳斤紝鑰屾槸鍦ㄧ幇鏈夊姛鑳界殑鍩虹涓婃彁渚涗竴涓洿楂樺眰嬈$殑鎶借薄錛屼嬌寰楄皟鐢ㄨ呭彲浠ョ洿鎺ヨ皟鐢紝鑰屼笉鐢ㄥ叧蹇?jī)鍐呴儴鐨勫疄鐜版柟寮忋備互CacheDependency宸ュ巶涓轟緥錛屾垜浠渶瑕佷負(fù)璋冪敤鑰呮彁渚涜幏寰桝ggregateCacheDependency瀵硅薄鐨勭畝渚挎柟娉曪紝鍥犺屽垱寤轟簡(jiǎn)DependencyFacade綾伙細(xì) DependencyFacade綾誨皝瑁呬簡(jiǎn)鑾峰彇AggregateCacheDependency綾誨瀷瀵硅薄鐨勯昏緫錛屽姝や竴鏉ワ紝璋冪敤鑰呭彲浠ヨ皟鐢ㄧ浉鍏蟲(chóng)柟娉曡幏寰楀垱寤虹浉鍏充緷璧栭」鐨凙ggregateCacheDependency綾誨瀷瀵硅薄錛?br />
AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency(); 姣旇搗鐩存帴璋冪敤DependencyAccess綾葷殑GetDependency()鏂規(guī)硶鑰岃█錛岄櫎浜?jiǎn)鏂规硶鏇唇巰鍗曚箣澶栵紝鍚屾椂瀹冭繕瀵笴acheDependencyAssembly閰嶇疆鑺傝繘琛屼簡(jiǎn)鍒ゆ柇錛屽鏋滃叾鍊間負(fù)絀猴紝鍒欒繑鍥瀗ull瀵硅薄銆?/p>
鍦≒etShop.Web鐨凙pp_Code鏂囦歡澶逛笅錛岄潤(rùn)鎬佺被WebUtility鐨凣etCategoryName()鍜孏etProductName()鏂規(guī)硶璋冪敤浜?jiǎn)DependencyFacade綾匯備緥濡侴etCategoryName()鏂規(guī)硶錛?br />
public static string GetCategoryName(string categoryId) string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId); // 媯(gè)鏌ョ紦瀛樹(shù)腑鏄惁瀛樺湪璇ユ暟鎹」; GetCategoryName()鏂規(guī)硶棣栧厛浼?xì)妫鏌ョ紦瀛樹(shù)腑鏄惁宸茬粡瀛樺湪CategoryName鏁版嵁欏癸紝濡傛灉宸茬粡瀛樺湪錛屽氨閫氳繃緙撳瓨鐩存帴鑾峰彇鏁版嵁錛涘惁鍒欏皢閫氳繃涓氬姟閫昏緫灞傝皟鐢ㄦ暟鎹闂眰璁塊棶鏁版嵁搴撹幏寰桟ategoryName錛屽湪鑾峰緱浜?jiǎn)CategoryName鍚庯紝浼?xì)灏嗘柊鑾峰彇鐨勬暟鎹畼q炲悓DependencyFacade綾誨垱寤虹殑AggregateCacheDependency瀵硅薄娣誨姞鍒扮紦瀛樹(shù)腑銆?/p>
WebUtility闈?rùn)鎬佺被琚〃紺哄眰鐨勮澶氶〉闈㈡墍璋冪敤錛屼緥濡侾roduct欏甸潰錛?br />
public partial class Products : System.Web.UI.Page 鏄劇ず欏甸潰title鐨勯昏緫鏄斁鍦≒age_Load浜嬩歡鏂規(guī)硶涓紝鍥犺屾瘡嬈℃墦寮璇ラ〉闈㈤兘瑕佹墽琛岃幏鍙朇ategoryName鐨勬柟娉曘傚鏋滄病鏈夐噰鐢ㄧ紦瀛樻満鍒訛紝褰揅ategory鏁版嵁杈冨鏃訛紝欏甸潰鐨勬樉紺哄氨浼?xì)闈炲父缂撴參銆?/p>
4.3.5 寮曞叆Proxy妯″紡 涓氬姟閫昏緫灞侭LL涓笌Product銆丆ategory銆両tem鏈夊叧鐨勪笟鍔℃柟娉曪紝鍏跺疄鐜伴昏緫鏄皟鐢ㄦ暟鎹闂眰錛圖AL錛夊璞¤闂暟鎹簱錛屼互鑾峰彇鐩稿叧鏁版嵁銆備負(fù)浜?jiǎn)鏀瑰杽绯痪l熸ц兘錛屾垜浠氨闇瑕佷負(fù)榪欎簺瀹炵幇鏂規(guī)硶澧炲姞緙撳瓨鏈哄埗鐨勯昏緫銆傚綋鎴戜滑鎿嶄綔澧炲姞浜?jiǎn)缂撳瓨鏈哄埗鐨勪笟鍔″璞℃椨灱屽浜庤皟鐢ㄨ呰岃█錛屽簲涓嶣LL涓氬姟瀵硅薄鐨勮皟鐢ㄤ繚鎸佷竴鑷淬備篃鍗蟲(chóng)槸璇達(dá)紝鎴戜滑闇瑕佸紩鍏ヤ竴涓柊鐨勫璞″幓鎺у埗鍘熸潵鐨凚LL涓氬姟瀵硅薄錛岃繖涓柊鐨勫璞″氨鏄疨roxy妯″紡涓殑浠g悊瀵硅薄銆?/p>
浠etShop.BLL.Product涓氬姟瀵硅薄涓轟緥錛孭etShop涓哄叾寤虹珛浜?jiǎn)浠g悊瀵硅薄ProductDataProxy錛屽茍鍦℅etProductByCategory()絳夋柟娉曚腑錛屽紩鍏ヤ簡(jiǎn)緙撳瓨鏈哄埗錛屼緥濡傦細(xì) private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings["ProductCacheDuration"]); if (!enableCaching) string key = "product_by_category_" + category; // Check if the data exists in the data cache // Create a AggregateCacheDependency object from the factory // Store the output in the data cache, and Add the necessary AggregateCacheDependency object 涓庝笟鍔¢昏緫灞侾roduct瀵硅薄鐨凣etProductsByCategory()鏂規(guī)硶鐩告瘮錛屽鍔犱簡(jiǎn)緙撳瓨鏈哄埗銆傚綋緙撳瓨鍐呬笉瀛樺湪鐩稿叧鏁版嵁欏規(guī)椂錛屽垯鐩存帴璋冪敤涓氬姟閫昏緫灞侾roduct鐨凣etProductsByCategory()鏂規(guī)硶鏉ヨ幏鍙栨暟鎹紝騫跺皢鍏朵笌瀵瑰簲鐨凙ggregateCacheDependency瀵硅薄涓璧峰瓨鍌ㄥ湪緙撳瓨?shù)腑銆?/p>
寮曞叆Proxy妯″紡錛屽疄鐜頒簡(jiǎn)鍦ㄧ紦瀛樼駭鍒笂瀵逛笟鍔″璞$殑灝佽錛屽寮轟簡(jiǎn)瀵逛笟鍔″璞$殑鎺у埗銆傜敱浜庢毚闇插湪瀵硅薄澶栫殑鏂規(guī)硶鏄竴鑷寸殑錛屽洜鑰屽浜庤皟鐢ㄦ柟鑰岃█錛岃皟鐢ㄤ唬鐞嗗璞′笌鐪熷疄瀵硅薄騫舵病鏈夊疄璐ㄧ殑鍖哄埆銆?/p>
浠庤亴璐e垎紱諱笌鍒嗗眰璁捐鐨勮搴﹀垎鏋愶紝鎴戞洿甯屾湜榪欎簺Proxy瀵硅薄鏄瀹氫箟鍦ㄤ笟鍔¢昏緫灞備腑錛岃屼笉鍍忓湪PetShop鐨勮璁¢偅鏍鳳紝琚垝鍒嗗埌琛ㄧず灞俇I涓傛澶栵紝濡傛灉闇瑕佽冭檻紼嬪簭鐨勫彲鎵╁睍鎬т笌鍙浛鎹㈡э紝鎴戜滑榪樺彲浠ヤ負(fù)鐪熷疄瀵硅薄涓庝唬鐞嗗璞″緩绔嬬粺涓鐨勬帴鍙f垨鎶借薄綾匯傜劧鑰岋紝鍗曚互PetShop鐨勮〃紺哄眰璋冪敤鏉ョ湅錛岄噰鐢ㄩ潤(rùn)鎬佺被涓庨潤(rùn)鎬佹柟娉曠殑鏂瑰紡錛屾垨璁告洿涓哄悎鐞嗐傛垜浠渶瑕佽皚璁幫紝“榪囧害璁捐”鏄蔣浠惰璁$殑璀︽垝綰褲?/p>
濡傛灉闇瑕佸UI灞傞噰鐢ㄧ紦瀛樻満鍒訛紝灝嗗簲鐢ㄧ▼搴忔暟鎹瓨鏀懼埌緙撳瓨?shù)腑锛尀鍙互璋冪敤杩欎簺浠g悊瀵硅薄銆備互ProductsControl鐢ㄦ埛鎺т歡涓轟緥錛岃皟鐢ㄦ柟寮忓涓嬶細(xì) productsList瀵硅薄灞炰簬鑷畾涔夌殑CustomList綾誨瀷錛岃繖鏄竴涓淳鐢熻嚜System.Web.UI.WebControls.DataList鎺т歡鐨勭被錛屽畠鐨凞ataSource灞炴у彲浠ユ帴鍙桰List闆嗗悎瀵硅薄銆?br />
涓嶈繃鍦≒etShop 4.0鐨勮璁′腑錛屽浜庣被浼間簬ProductsControl綾誨瀷鐨勬帶浠惰岃█錛岄噰鐢ㄧ殑緙撳瓨鏈哄埗鏄〉杈撳嚭緙撳瓨銆傛垜浠彲浠ヤ粠ProductsControl.ascx欏甸潰鐨凷ource浠g爜涓彂鐜扮鍊細(xì) 涓嶢SP.NET 1.x鐨勯〉杈撳嚭緙撳瓨?shù)笉鍚岀殑鏄Q屽湪ASP.NET 2.0涓紝涓篈SP.NET鐢ㄦ埛鎺т歡鏂板紩鍏ヤ簡(jiǎn)CachePolicy灞炴э紝璇ュ睘鎬х殑綾誨瀷涓篊ontrolCachePolicy綾伙紝瀹冧互緙栫▼鏂瑰紡瀹炵幇浜?jiǎn)瀵笰SP.NET鐢ㄦ埛鎺т歡鐨勮緭鍑虹紦瀛樿緗傛垜浠彲浠ラ氳繃璁劇疆ControlCachePolicy綾葷殑Dependency灞炴э紝鏉ヨ緗笌璇ョ敤鎴鋒帶浠剁浉鍏崇殑渚濊禆欏癸紝渚嬪鍦≒roductsControl鐢ㄦ埛鎺т歡涓紝榪涜濡備笅鐨勮緗細(xì) 閲囩敤欏佃緭鍑虹紦瀛橈紝騫朵笖鍒╃敤ControlCachePolicy璁劇疆杈撳嚭緙撳瓨錛岃兘澶熷皢涓氬姟鏁版嵁涓庢暣涓〉闈㈡斁鍏ュ埌緙撳瓨?shù)腑銆傝繖縐嶆柟寮忔瘮璧峰簲鐢ㄧ▼搴忕紦瀛樿岃█錛屽湪鎬ц兘涓婃湁寰堝ぇ鐨勬彁楂樸傚悓鏃訛紝瀹冨張閫氳繃寮曞叆鐨凷qlCacheDependency鐗規(guī)ф湁鏁堝湴閬垮厤浜?#8220;鏁版嵁榪囨湡”鐨勭己鐐癸紝鍥犺屽湪PetShop 4.0涓騫挎硾閲囩敤銆傜浉鍙嶏紝涔嬪墠涓篜roduct銆丆ategory銆両tem涓氬姟瀵硅薄寤虹珛鐨勪唬鐞嗗璞″垯琚?#8220;鎶曢棽鏁g疆”錛屼粎浠呬綔涓轟竴縐嶈璁℃柟娉曠殑灞曠ず鑰?#8220;騫稿瓨”涓庢暣涓郴緇熺殑婧愪唬鐮佷腑銆?/p>
1銆乄EB錛濊〃紺哄眰
2銆丅LL錛濅笟鍔¢昏緫灞?br />
3銆両DAL錛濇暟鎹闂眰鎺ュ彛瀹氫箟
4銆丮odel錛濅笟鍔″疄浣?br />
5銆丏ALFactory錛濇暟鎹眰鐨勬娊璞″伐鍘?鍒涘緩鍙嶅皠)
6銆丼QLServerDAL錛漇QLServer鏁版嵁璁塊棶灞?/ OracleDAL錛漁racle鏁版嵁璁塊棶灞?
涓夈佸疄鐜版楠?br />
1銆佸垱寤篗odel錛屽疄鐜頒笟鍔″疄浣撱?br />
2銆佸垱寤篒DAL錛屽疄鐜版帴鍙c?br />
3銆佸垱寤篠QLServerDAL錛屽疄鐜版帴鍙i噷鐨勬柟娉曘?br />
4銆佸鍔爓eb.config閲岀殑閰嶇疆淇℃伅錛屼負(fù)SQLServerDAL鐨勭▼搴忛泦銆?br />
5銆佸垱寤篋ALFactory錛岃繑鍥炵▼搴忛泦鐨勬寚瀹氱被鐨勫疄渚嬨?br />
6銆佸垱寤築LL錛岃皟鐢―ALFactory錛屽緱鍒扮▼搴忛泦鎸囧畾綾葷殑瀹炰緥錛屽畬鎴愭暟鎹搷浣滄柟娉曘?br />
7銆佸垱寤篧EB錛岃皟鐢˙LL閲岀殑鏁版嵁鎿嶄綔鏂規(guī)硶銆?/p>
public interface IPetShopCacheDependency
{
AggregateCacheDependency GetDependency();
}
public abstract class TableDependency : IPetShopCacheDependency
{
// This is the separator that's used in web.config
protected char[] configurationSeparator = new char[] { ',' };
protected TableDependency(string configKey)
{
string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
string tableConfig = ConfigurationManager.AppSettings[configKey];
string[] tables = tableConfig.Split(configurationSeparator);
dependency.Add(new SqlCacheDependency(dbName, tableName));
}
public AggregateCacheDependency GetDependency()
{
return dependency;
}
}
<add key="CacheDatabaseName" value="MSPetShop4"/>
<add key="CategoryTableDependency" value="Category"/>
<add key="ProductTableDependency" value="Product,Category"/>
<add key="ItemTableDependency" value="Product,Category,Item"/>
{
public Product() : base("ProductTableDependency") { }
}
{
public static IPetShopCacheDependency CreateCategoryDependency()
{
return LoadInstance("Category");
}
public static IPetShopCacheDependency CreateProductDependency()
{
return LoadInstance("Product");
}
public static IPetShopCacheDependency CreateItemDependency()
{
return LoadInstance("Item");
}
private static IPetShopCacheDependency LoadInstance(string className)
{
string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
string fullyQualifiedClass = path + "." + className;
return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
}
}
鏁翠釜宸ュ巶妯″紡鐨勫疄鐜板鍥?-3鎵紺猴細(xì)
鍥?-3 CacheDependency宸ュ巶
AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();
鍥?-4 Facade妯″紡
public static class DependencyFacade
{
private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
public static AggregateCacheDependency GetCategoryDependency()
{
if (!string.IsNullOrEmpty(path))
return DependencyAccess.CreateCategoryDependency().GetDependency();
else
return null;
}
public static AggregateCacheDependency GetProductDependency()
{
if (!string.IsNullOrEmpty(path))
return DependencyAccess.CreateProductDependency().GetDependency();
else
return null;
}
public static AggregateCacheDependency GetItemDependency()
{
if (!string.IsNullOrEmpty(path))
return DependencyAccess.CreateItemDependency().GetDependency();
else
return null;
}
}
{
Category category = new Category();
if (!enableCaching)
return category.GetCategory(categoryId).Name;
string data = (string)HttpRuntime.Cache[cacheKey];
if (data == null)
{
// 閫氳繃web.config鐨勯厤緗幏鍙杁uration鍊?
int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
// 濡傛灉緙撳瓨?shù)腑涓嶅瓨鍦ㄨ鏁版嵁椤瑰Q屽垯閫氳繃涓氬姟閫昏緫灞傝闂暟鎹簱鑾峰彇;
data = category.GetCategory(categoryId).Name;
// 閫氳繃Facade綾誨垱寤篈ggregateCacheDependency瀵硅薄;
AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
// 灝嗘暟鎹」浠ュ強(qiáng)AggregateCacheDependency 瀵硅薄瀛樺偍鍒扮紦瀛樹(shù)腑;
HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return data;
}
{
protected void Page_Load(object sender, EventArgs e)
{
Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
}
}
public static class ProductDataProxy
{
private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
public static IList
GetProductsByCategory(string category)
{
Product product = new Product();
return product.GetProductsByCategory(category);
IList data = (IList )HttpRuntime.Cache[key];
if (data == null)
{
data = product.GetProductsByCategory(category);
AggregateCacheDependency cd = DependencyFacade.GetProductDependency();
HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
}
return data;
}
}
productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);
<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>
protected void Page_Load(object sender, EventArgs e)
{
this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
}
public interface ICategory {
/// <summary>
/// Method to get all categories
/// </summary>
/// <returns>Interface to Model Collection Generic of categories</returns>
IList<CategoryInfo> GetCategories();
/// <summary>
/// Get information on a specific category
/// </summary>
/// <param name="categoryId">Unique identifier for a category</param>
/// <returns>Business Entity representing an category</returns>
CategoryInfo GetCategory(string categoryId);
}
鎴戠煡閬揑List<CategoryInfo>鏄寖鍨?
琛ㄧずlist涓殑item鏄疌ategoryInfo瀵硅薄
璇烽棶涓轟粈涔堢敤IList<CategoryInfo>
鐢↙ist<CategoryInfo>鍙互鍚楋紵
涓よ呮湁浠涔堝尯鍒紵璋㈣阿
娌℃湁浠涔堝尯鍒紝榪欐牱鍐欑伒媧繪уぇ錛屽疄鐜癷list鎺ュ彛鐨勭被寰堝錛屼綘鍐欐垚list鍚庯紝涔熻浠ュ悗浣犺鏀規(guī)垚闈瀕ist鐨勶紝灝變細(xì)瑕佹敼寰堝浠g爜
涓句釜渚嬪瓙
RenderControlToString(DataList L//Control C)
浣犺涓烘槸鍐檆ontrol榪樻槸鍐檇atalist浠g爜鐨勯氱敤鎬ч珮?
OOP緙栫爜鍘熷垯:灝藉彲鑳界敤鎺ュ彛緙栫▼
]]>
{
public static readonly string connectionString = ConfigurationManager.ConnectionStrings["SqlConnString"].ConnectionString;
SqlConnection conn;
#region open SqlConnection
public static void Open() {
conn = new SqlConnection(connectionString);
if (conn.State != ConnectionState.Open)
conn.Open();
}
#endregion
#region close SqlConnection
public static void Close() {
if (conn != null)
{
conn.Close();
conn.Dispose();
}
}
#endregion
#region prepare SqlCommand
private static void PrepareCommand(SqlCommand cmd, CommandType cmdType, string cmdText, SqlParameter[] cmdParms) {
Open();
cmd.Connection = conn;
cmd.CommandType = cmdType;
cmd.CommandText = cmdText;
if (cmdParms != null)
{
foreach (SqlParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
#endregion
#region parm cache
/*
浣跨敤涓涓搱甯岃〃鏉ヤ繚瀛樼紦瀛樼殑鍙傛暟 鍙紦瀛樺弬鏁板悕
鍝堝笇琛ㄧ殑鐗圭偣:涓涓敭瀵瑰簲涓涓糼ey瀵箆alue(涓簅bject闇瑕佺被鍨嬭漿鍖? 涓嶈兘鍑虹幇涓や釜鐩稿悓鐨勯敭 鍚﹀垯error
涓嬮潰鐨勫搱甯岃〃parmCache瀹氫箟涓簊tatic鍗充竴嬈″畾涔夊叏灞浣跨敤
鎵浠ュ彲鑳戒細(xì)鍑虹幇鏈変漢鍦ㄨ鐨勬椂鍊欙紝鏈変漢鍦ㄥ啓錛屼竴鑸細(xì)鐢↙ock灝卞儚Asp涓敤Application["count"]鏉ョ粺璁$偣鍑?yán)L暟涓鏍?br />
瑕佸厛閿佸悗瑙i攣
浣?net妗嗘灦鎻愪緵浜?jiǎn)Synchroized sync鍜宻yncroize涓枃鎰忔?鍚屾錛屽悓鏃跺彂鐢?br />
鏉ユ彁渚涜繖涓鎿嶄綔
*/
private static Hashtable parmCache = Hashtable.Synchronized(new Hashtable());
public static void CacheParameters(string cacheKey, params SqlParameter[] commandParameters) {
parmCache[cacheKey] = commandParameters;
}
/*
1銆佷負(fù)浣曡鍏嬮殕鍛?涓轟綍涓嶇洿鎺eturn cachedParms
鏈変竴涓弬鏁版暟緇?br />
SqlParameter[] parms={
new SqlParameter("@num1",SqlDbType.Int,4),
new SqlParameter("@num2",SqlDbType.Int,4)
}
緙撳瓨璇ユ暟緇?br />
鐢ㄦ埛a鍜宐閮芥墽琛屾彃鍏ユ搷浣?br />
a鐢ㄦ埛鎻掑叆浜?,1
b鐢ㄦ埛鎻掑叆浜?,2
濡傛灉涓嶇敤鍏嬮殕鐨勮瘽錛屽弬鏁版暟緇勫彧鏈変竴浠?br />
鑰?涓敤鎴烽渶瑕佹牴鎹笉鍚岀殑鎯呭喌璧嬩簬涓嶅悓鐨勫?br />
鎵浠ュ氨鐢ㄤ簡(jiǎn)鍏嬮殕浜?br />
2銆?ICloneable)cachedParms[i]鍏堝皢HashTable杞負(fù)ICloneable榪欐牱HashTable灝卞叿鏈変簡(jiǎn)Clone()鍏嬮殕鏂規(guī)硶浜?br />
鍏嬮殕涓浠藉悗鏄粈涔堢被鍨嬪憿錛岋紝褰撶劧瑕佸己鍒惰漿鍖栦負(fù)(SqlParameter)浜?br />
鏈鍚庡皢瀹冭祴鍊肩粰clonedParms[i]
*/
public static SqlParameter[] GetCachedParameters(string cacheKey) {
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
for (int i = 0; i < cachedParms.Length; i++)
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
#endregion
//below method support sqltext and procedure
#region ExecuteReader
/*
parms鐨勪綔鐢紝榪欎篃鏄竴涓煡璇嗙偣
涓句緥:
ExecuteReader(*,*,null)鎴愬姛榪愯
ExecuteReader(*,*,new SqlParameter(*))鎴愬姛榪愯
ExecuteReader(*,*,new SqlParameter(*),new SqlParameter(*))鎴愬姛榪愯
ExecuteReader(*,*,{new SqlParameter(*),new SqlParameter(*),})鎴愬姛榪愯
瀹冭鍙傛暟綾誨瀷鍜屽弬鏁頒釜鏁頒換鎰?br />
榪欏彲緇欎簡(jiǎn)涓嶆槸涓鑸殑濂藉錛屼綘涓嶅繀涓篠qlParameter鍜孲qlParameter[]榪涜閲嶈澆錛屽啓涓婁袱涓嚱鏁?br />
鍙堜負(fù)null鍐欎笂涓涓嚱鏁幫紝鍥犱負(fù)null浼?xì)涓嶆槑纭皟鐢⊿qlParameter鐨勫嚱鏁拌繕鏄疭qlParameter[]鐨勫嚱鏁?br />
鍟ヤ綘涓嶇煡閬撴垜鍦ㄨ浠涔堬紝鎵撳眮灞?閭e洖鍘葷湅鐪媍++鐨勫嚱鏁伴噸杞?br />
*/
public static SqlDataReader ExecuteReader(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
try {
PrepareCommand(cmd, null, cmdType, cmdText, commandParameters);
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return rdr;
}
catch {
Close();
throw;
}
}
#endregion
#region ExecuteNonQuery
public static void ExecuteNonQuery(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, cmdType, cmdText, commandParameters);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
Close();
}
#endregion
#region ExecuteScalar
public static object ExecuteScalar(CommandType cmdType, string cmdText, params SqlParameter[] commandParameters) {
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
Close();
return val;
}
#endregion
}
}