您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何分析Web應用架構中的查詢傳遞,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在Web應用開發中,最常見也容易變化的一種需求是根據不同的查詢條件獲取數據列表。如何傳遞查詢條件將影響程序應對需求變化的能力,一定要在架構中重點考慮。
開始時我們使用一堆參數傳遞查詢條件,比如:
List<SiteMsg> GetMsgList(int pageIndex, int pageSize, int RecipientId);
結果,每個不同的查詢都要寫一個接口,產生了一堆接口;查詢條件改變,接口也隨之要改。寫程序最痛苦的事莫過于接口的頻繁變化。
后來使用查詢對像,比如:
List<SiteMsg> GetMsgList(SiteMsgQuery msgQuery);
這樣,查詢條件改變時,只需修改SiteMsgQuery的定義,接口保持不變。采用這個方法后,寫代碼比之前少了很多痛苦。
但使用這個方法有個地方不爽,完成一次查詢需要進行兩次實例化,一次是查詢對象SiteMsgQuery的實例化,一次是領域對象SiteMsgManager(負責業務邏輯)的實例化。在博客園程序架構中,查詢對象的實例化是在表現層完成的,如果是ajax調用,json會自動反序列為查詢對象;領域對象的實例化在服務層完成。
為了讓代碼寫的更爽一些,我們又進行了嘗試,取消查詢對象SiteMsgQuery,將它的屬性放到領域對象中。這樣減少了一次實例化,只需一次,如果是ajax調用,可以實現服務器端“零實例化”。
下面看一下代碼示例:
領域模型的定義:
[DataContract] public class SiteMsgManager { public SiteMsgManager() { } #region Properies [DataMember] public int PageIndex { get; set; } [DataMember] public int PageSize { get; set; } [DataMember] public int RecipientId { get; set; } public List<SiteMsg> List { get; set; } #endregion public void GetList() { using (SpaceObjectContext context = new SpaceObjectContext()) { this.List = context.SiteMsgs .Where(msg => msg.RecipientSpaceUserId == this.RecipientId) .OrderByDescending(msg => msg.id) .Skip((PageIndex - 1) * PageSize) .Take(this.PageSize) .ToList(); } }
服務實現類(也是WCF的服務實現):
public class MsgService : IMsgService { public List<SiteMsg> GetMsgList(SiteMsgManager siteMsgManager) { siteMsgManager.GetList(); return siteMsgManager.List; } }
UI層調用代碼(WCF調用,ASP.NET MVC控制器):
public class MsgController : Controller
{
//ajax調用
[HttpPost]
public ActionResult List(SiteMsgManager msgManager)
{
return View("MsgList", GetInboxMsgList(msgManager));
}
public ActionResult Inbox()
{
SiteMsgManager msgManager = new SiteMsgManager()
{
PageIndex = 1,
PageSize = 30
};
return View("Inbox", GetInboxMsgList(msgManager));
}
private List<SiteMsg> GetInboxMsgList(SiteMsgManager msgManager)
{
int spaceUserId = Util.GetCurrentUser
(System.Web.HttpContext.Current).SpaceUserID;msgManager.RecipientId = spaceUserId;
MsgServiceClient client = new MsgServiceClient();
List<SiteMsg> siteMsgList = client.GetMsgList(msgManager).ToList();
try { client.Close(); }
catch { client.Abort(); }
return siteMsgList;
}
}
看看上面供ajax調用的List方法,不需要進行SiteMsgManager的實例化,系統根據ajax客戶端傳遞過來的json參數自動反序列化生成SiteMsgManager對象。
再來看看ajax客戶端代碼:
function GetMsgList(pageIndex, pageSize) { var msgManager = {} msgManager.PageIndex = pageIndex; msgManager.PageSize = pageSize; $.ajaxSettings.dataType = 'plain/text'; $.ajaxSettings.url = '/msg/list'; $.ajaxSettings.data = '{"msgManager":' + JSON.stringify(msgManager) + '}'; $.ajaxSettings.success = function (data) { $("#msg_list").html(data); }; $.ajax(); }
js傳遞的也是一個對像。
整個ajax調用的流程是這樣的:js對象(msgManager)->json->MsgController(MVC控制器)->代理領域對象SiteMsgManager(WCF客戶端代理類的實例)->WCF服務接口->WCF服務實現(自動通過反序列化生成領域對象SiteMsgManager,并調用GetList()方法)->領域對象完成業務邏輯操作返回數據。
采用這種方法,感覺寫代碼比以前更享受了。我們在實際開發中也開始使用這種架構,并根據實際使用情況進一步改進。
上述內容就是如何分析Web應用架構中的查詢傳遞,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。