在Web应用开发中,最常见也容易变化的一种需求是根据不同的查询条件获取数据列表。如何传递查询条件将影响程序应对需求变化的能力,一定要在架构中重点考虑。
光泽ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
开始时我们使用一堆参数传递查询条件,比如:
- List
GetMsgList(int pageIndex, int pageSize, int RecipientId);
结果,每个不同的查询都要写一个接口,产生了一堆接口;查询条件改变,接口也随之要改。写程序最痛苦的事莫过于接口的频繁变化。
后来使用查询对像,比如:
- List
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
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
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
GetInboxMsgList(SiteMsgManager msgManager) - {
- int spaceUserId = Util.GetCurrentUser
(System.Web.HttpContext.Current).SpaceUserID;- msgManager.RecipientId = spaceUserId;
- MsgServiceClient client = new MsgServiceClient();
- List
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应用架构分析之查询传递
文章分享:http://www.shufengxianlan.com/qtweb/news15/195215.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联