成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Web應用架構分析之查詢傳遞

開發 前端
在Web應用開發中,最常見也容易變化的一種需求是根據不同的查詢條件獲取數據列表。如何傳遞查詢條件將影響程序應對需求變化的能力,一定要在架構中重點考慮。

在Web應用開發中,最常見也容易變化的一種需求是根據不同的查詢條件獲取數據列表。如何傳遞查詢條件將影響程序應對需求變化的能力,一定要在架構中重點考慮。

開始時我們使用一堆參數傳遞查詢條件,比如:

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

結果,每個不同的查詢都要寫一個接口,產生了一堆接口;查詢條件改變,接口也隨之要改。寫程序最痛苦的事莫過于接口的頻繁變化。

后來使用查詢對像,比如:

  1. List<SiteMsg> GetMsgList(SiteMsgQuery msgQuery); 

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

但使用這個方法有個地方不爽,完成一次查詢需要進行兩次實例化,一次是查詢對象SiteMsgQuery的實例化,一次是領域對象SiteMsgManager(負責業務邏輯)的實例化。在博客園程序架構中,查詢對象的實例化是在表現層完成的,如果是ajax調用,json會自動反序列為查詢對象;領域對象的實例化在服務層完成。

為了讓代碼寫的更爽一些,我們又進行了嘗試,取消查詢對象SiteMsgQuery,將它的屬性放到領域對象中。這樣減少了一次實例化,只需一次,如果是ajax調用,可以實現服務器端“零實例化”。

下面看一下代碼示例:

領域模型的定義:

  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<SiteMsg> 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.     }             

服務實現類(也是WCF的服務實現):

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

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

  1. public class MsgController : Controller  
  2. {  
  3.     //ajax調用  
  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<SiteMsg> 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<SiteMsg> siteMsgList = client.GetMsgList(msgManager).ToList();  
  26.         try { client.Close(); }  
  27.         catch { client.Abort(); }  
  28.         return siteMsgList;  
  29.     }  

看看上面供ajax調用的List方法,不需要進行SiteMsgManager的實例化,系統根據ajax客戶端傳遞過來的json參數自動反序列化生成SiteMsgManager對象。

再來看看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傳遞的也是一個對像。

整個ajax調用的流程是這樣的:js對象(msgManager)->json->MsgController(MVC控制器)->代理領域對象SiteMsgManager(WCF客戶端代理類的實例)->WCF服務接口->WCF服務實現(自動通過反序列化生成領域對象SiteMsgManager,并調用GetList()方法)->領域對象完成業務邏輯操作返回數據。

采用這種方法,感覺寫代碼比以前更享受了。我們在實際開發中也開始使用這種架構,并根據實際使用情況進一步改進。
 

【編輯推薦】

  1. Web開發者欣喜若狂的40個UI設計工具和資源
  2. 是什么讓一個Web應用程序變得如此偉大?
  3. Web打印的在線設計
  4. 2011年Web前端技術展望:jQuery移動開發新選擇
  5. 代替桌面工具 10款最給力的Web開發與設計工具
責任編輯:陳貽新 來源: 杜勇的博客
相關推薦

2011-03-25 11:06:46

2011-03-25 11:18:51

2011-07-15 14:21:23

2013-09-13 12:58:07

原生應用Web應用混合應用

2009-11-02 15:57:36

VB.NET WEB

2010-11-23 15:42:14

2009-09-14 17:03:32

LINQ模糊查詢

2009-11-25 10:57:17

2023-01-09 17:04:24

2010-09-17 15:25:31

2017-11-09 16:07:00

Web應用內存

2011-03-25 10:50:26

2023-11-29 13:55:00

系統設計Web

2009-04-29 14:51:18

2016-11-28 09:13:29

單頁Web模板數據

2012-09-25 09:31:58

ASP.NETC#Web

2016-03-19 15:40:00

2015-02-02 15:46:59

Web應用架構大數據

2019-05-09 09:15:28

Web網站架構

2014-05-19 15:59:35

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩国产专区 | 亚洲精品一区国语对白 | 日日摸日日添日日躁av | 亚洲精品久久久久久首妖 | 欧美在线一区二区三区 | 午夜国产一区 | 91精品国产综合久久精品 | 久久久成人精品 | 黄色国产 | 日韩午夜一区二区三区 | 91精品麻豆日日躁夜夜躁 | 成人影院一区二区三区 | 视频一区二区三区在线观看 | 欧美精品区 | 黄色一级大片在线免费看产 | 在线观看视频你懂得 | 午夜99| 日本一区二区电影 | 最新中文字幕在线播放 | 你懂的国产 | 午夜久久久久久久久久一区二区 | www.99re | 欧美成年网站 | 亚洲91精品| 国产在线精品一区二区 | 日本免费网 | 日韩欧美国产精品 | 欧美日韩国产在线 | 高清亚洲| 国产精品成人一区二区 | 国产精品久久久久久久久免费相片 | 欧美日韩精品免费观看 | 在线观看国产精品视频 | 欧美一区二区三区国产精品 | 国产精品成人一区 | 欧美激情国产精品 | 毛片网站在线观看 | 亚洲国产黄色av | 日韩免费看视频 | 色偷偷888欧美精品久久久 | 伊人性伊人情综合网 |