文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何分析Web应用架构中的查询传递

2024-04-02 19:55

关注

本篇文章为大家展示了如何分析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控制器):

  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客户端代码:

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应用架构中的查询传递,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯