日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Web應(yīng)用架構(gòu)分析之查詢傳遞

在Web應(yīng)用開(kāi)發(fā)中,最常見(jiàn)也容易變化的一種需求是根據(jù)不同的查詢條件獲取數(shù)據(jù)列表。如何傳遞查詢條件將影響程序應(yīng)對(duì)需求變化的能力,一定要在架構(gòu)中重點(diǎn)考慮。

光澤ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

開(kāi)始時(shí)我們使用一堆參數(shù)傳遞查詢條件,比如:

 
 
 
  1. List GetMsgList(int pageIndex, int pageSize, int RecipientId); 

結(jié)果,每個(gè)不同的查詢都要寫一個(gè)接口,產(chǎn)生了一堆接口;查詢條件改變,接口也隨之要改。寫程序最痛苦的事莫過(guò)于接口的頻繁變化。

后來(lái)使用查詢對(duì)像,比如:

 
 
 
  1. List GetMsgList(SiteMsgQuery msgQuery); 

這樣,查詢條件改變時(shí),只需修改SiteMsgQuery的定義,接口保持不變。采用這個(gè)方法后,寫代碼比之前少了很多痛苦。

但使用這個(gè)方法有個(gè)地方不爽,完成一次查詢需要進(jìn)行兩次實(shí)例化,一次是查詢對(duì)象SiteMsgQuery的實(shí)例化,一次是領(lǐng)域?qū)ο骃iteMsgManager(負(fù)責(zé)業(yè)務(wù)邏輯)的實(shí)例化。在博客園程序架構(gòu)中,查詢對(duì)象的實(shí)例化是在表現(xiàn)層完成的,如果是ajax調(diào)用,json會(huì)自動(dòng)反序列為查詢對(duì)象;領(lǐng)域?qū)ο蟮膶?shí)例化在服務(wù)層完成。

為了讓代碼寫的更爽一些,我們又進(jìn)行了嘗試,取消查詢對(duì)象SiteMsgQuery,將它的屬性放到領(lǐng)域?qū)ο笾?。這樣減少了一次實(shí)例化,只需一次,如果是ajax調(diào)用,可以實(shí)現(xiàn)服務(wù)器端“零實(shí)例化”。

下面看一下代碼示例:

領(lǐng)域模型的定義:

 
 
 
  1. [DataContract]  
  2. public class SiteMsgManager  
  3. {  
  4. public SiteMsgManager()  
  5. {  
  6. }  
  7.  
  8. #region Properies  
  9.  
  10. [DataMember]  
  11. public int PageIndex { get; set; }  
  12.  
  13. [DataMember]  
  14. public int PageSize { get; set; }  
  15.  
  16. [DataMember]  
  17. public int RecipientId { get; set; }  
  18.  
  19. public List List { get; set; }  
  20.  
  21. #endregion  
  22.  
  23. public void GetList()  
  24. {  
  25.     using (SpaceObjectContext context = new SpaceObjectContext())  
  26.     {  
  27.         this.List = context.SiteMsgs  
  28.             .Where(msg => msg.RecipientSpaceUserId == this.RecipientId)  
  29.             .OrderByDescending(msg => msg.id)  
  30.             .Skip((PageIndex - 1) * PageSize)  
  31.             .Take(this.PageSize)  
  32.             .ToList();  
  33.     }             

服務(wù)實(shí)現(xiàn)類(也是WCF的服務(wù)實(shí)現(xiàn)):

 
 
 
  1. public class MsgService : IMsgService  
  2. {  
  3.     public List GetMsgList(SiteMsgManager siteMsgManager)  
  4.     {  
  5.         siteMsgManager.GetList();  
  6.         return siteMsgManager.List;  
  7.     }  

UI層調(diào)用代碼(WCF調(diào)用,ASP.NET MVC控制器):

 
 
 
  1. public class MsgController : Controller  
  2. {  
  3.     //ajax調(diào)用  
  4.     [HttpPost]      
  5.     public ActionResult List(SiteMsgManager msgManager)  
  6.     {  
  7.         return View("MsgList", GetInboxMsgList(msgManager));  
  8.     }  
  9.  
  10.     public ActionResult Inbox()  
  11.     {  
  12.         SiteMsgManager msgManager = new SiteMsgManager()  
  13.         {  
  14.             PageIndex = 1,  
  15.             PageSize = 30 
  16.         };          
  17.         return View("Inbox", GetInboxMsgList(msgManager));  
  18.     }  
  19.  
  20.     private List GetInboxMsgList(SiteMsgManager msgManager)  
  21.     {  
  22.         int spaceUserId = Util.GetCurrentUser
    (System.Web.HttpContext.Current).SpaceUserID;  
  23.         msgManager.RecipientId = spaceUserId;  
  24.         MsgServiceClient client = new MsgServiceClient();  
  25.         List siteMsgList = client.GetMsgList(msgManager).ToList();  
  26.         try { client.Close(); }  
  27.         catch { client.Abort(); }  
  28.         return siteMsgList;  
  29.     }  

看看上面供ajax調(diào)用的List方法,不需要進(jìn)行SiteMsgManager的實(shí)例化,系統(tǒng)根據(jù)ajax客戶端傳遞過(guò)來(lái)的json參數(shù)自動(dòng)反序列化生成SiteMsgManager對(duì)象。

再來(lái)看看ajax客戶端代碼:

 
 
 
  1. function GetMsgList(pageIndex, pageSize) {  
  2.     var msgManager = {}  
  3.     msgManager.PageIndex = pageIndex;  
  4.     msgManager.PageSize = pageSize;  
  5.  
  6.     $.ajaxSettings.dataType = 'plain/text';     
  7.     $.ajaxSettings.url = '/msg/list';  
  8.     $.ajaxSettings.data = '{"msgManager":' + JSON.stringify(msgManager) + '}';  
  9.     $.ajaxSettings.success = function (data) {  
  10.         $("#msg_list").html(data);  
  11.     };  
  12.     $.ajax();  

js傳遞的也是一個(gè)對(duì)像。

整個(gè)ajax調(diào)用的流程是這樣的:js對(duì)象(msgManager)->json->MsgController(MVC控制器)->代理領(lǐng)域?qū)ο骃iteMsgManager(WCF客戶端代理類的實(shí)例)->WCF服務(wù)接口->WCF服務(wù)實(shí)現(xiàn)(自動(dòng)通過(guò)反序列化生成領(lǐng)域?qū)ο骃iteMsgManager,并調(diào)用GetList()方法)->領(lǐng)域?qū)ο笸瓿蓸I(yè)務(wù)邏輯操作返回?cái)?shù)據(jù)。

采用這種方法,感覺(jué)寫代碼比以前更享受了。我們?cè)趯?shí)際開(kāi)發(fā)中也開(kāi)始使用這種架構(gòu),并根據(jù)實(shí)際使用情況進(jìn)一步改進(jìn)。
 

【編輯推薦】

  1. Web開(kāi)發(fā)者欣喜若狂的40個(gè)UI設(shè)計(jì)工具和資源
  2. 是什么讓一個(gè)Web應(yīng)用程序變得如此偉大?
  3. Web打印的在線設(shè)計(jì)
  4. 2011年Web前端技術(shù)展望:jQuery移動(dòng)開(kāi)發(fā)新選擇
  5. 代替桌面工具 10款最給力的Web開(kāi)發(fā)與設(shè)計(jì)工具

分享標(biāo)題:Web應(yīng)用架構(gòu)分析之查詢傳遞
當(dāng)前鏈接:http://www.5511xx.com/article/djohgic.html