在混合开发框架模式中,有时候我们在处理树形节点的时候,需要很多关联的处理,可能需要结合用户配置信息,属性字典,以及表的字段分类等信息来展示一个结构树,那么在处理的时候就可能会频繁的对这些接口API进行调用,而如果我们使用Web API一次性的获取树形节点信息,然后统一加载的话,性能会提升很多,本篇随笔介绍通过封装一个总的树形结构列表数据返回的Web API,从而在Winform客户端一次性展示的方式,实现性能的优化处理。

1、树形结构展示效果

如下面的CRM客户关系管理系统中,我们需要展示很多客户相关的树形节点,以方便快捷查询相关类型的客户信息。

那么这个树列表就需要结合很多属性来处理了,包括了客户的字段信息,客户配置显示信息,每个字段类型的对应的字典信息,如客户状态、客户类型等等。

因此如果在客户端整合逻辑,那么需要对几个不同的处理接口进行调用并处理,这种解析起来比较慢,而且也会导致处理效率问题。

一般情况下,我们云端的服务器性能会比客户端的性能更好一些,这些对数据库处理的逻辑封装在Web API的后盾会更加方便,也就是瘦客户端的方式更有效率了。

2、Web API端封装处理逻辑

例如我们定义一个以下的接口来获取数据。

        /// <summary>///  获取客户树形类别的数据/// </summary>/// <param name="userId">当前用户ID</param>/// <param name="companyId">所属公司ID</param>/// <param name="dataFilter">数据过滤条件</param>/// <param name="shareUserCondition">分配用户ID条件</param>/// <returns></returns>List<TreeNodeInfo> GetCustomerTree(string userId, string companyId, string dataFilter, string shareUserCondition);

其中TreeNodeInfo对象是我们自己定义的一个对象,用来承载具有层级信息的列表信息。

具体这个类的代码如下所示。

    /// <summary>/// 用来承载TreeNode的信息/// </summary>[Serializable][DataContract]public class TreeNodeInfo{/// <summary>/// 子对象集合/// </summary>
        [DataMember]public List<TreeNodeInfo> Nodes { get; set; }/// <summary>/// 节点名称/// </summary>
        [DataMember]public string Text { get; set; }/// <summary>/// 节点标签/// </summary>
        [DataMember]public string Tag { get; set; }/// <summary>/// 图标序号/// </summary>
        [DataMember]public int IconIndex { get; set; }/// <summary>/// 是否展开/// </summary>
        [DataMember]public bool IsExpanded { get; set; }/// <summary>/// 前景色/// </summary>
        [DataMember]public string ForeColor { get; set; }/// <summary>/// 默认构造函数/// </summary>public TreeNodeInfo() {this.Nodes = new List<TreeNodeInfo>();}/// <summary>/// 参数构造函数/// </summary>/// <param name="text">节点名称</param>/// <param name="iconIndex">图标序号</param>/// <param name="tag">节点标签</param>public TreeNodeInfo(string text, int iconIndex, string tag = "") : this(){this.Text = text;this.IconIndex = iconIndex;this.Tag = tag;}}

Web API端的控制器方法如下所示。

最后具体在客户端界面绑定显示数据的逻辑如下所示。

        /// <summary>/// 使用Json对象创建列表树/// </summary>private void InitTree(){//清空节点信息this.treeView1.Nodes.Clear();//通过Web API方式获取树对象列表结构var list = CallerFactory<ICustomerService>.Instance.GetCustomerTree(LoginUserInfo.ID, this.SelectedCompanyID,this.DataFilterCondition, this.ShareUserCondition);if (list != null && list.Count > 0){//遍历每个节点,生成对应的TreeView对象节点foreach (var node in list){//构建TreeView对象节点信息TreeNode parentNode = new TreeNode(node.Text, node.IconIndex, node.IconIndex);parentNode.Tag = node.Tag;if (!string.IsNullOrEmpty(node.ForeColor)){//如果节点颜色有值,则修改前景色parentNode.ForeColor = ColorTranslator.FromHtml(node.ForeColor);}//递归处理树形列表
                    InitTreeNode(node.Nodes, parentNode);if (parentNode.Text != "标记颜色"){parentNode.Expand();//选择性的展开部分一级节点
                    }//把根节点加入到树对象里面显示this.treeView1.Nodes.Add(parentNode);}}}/// <summary>/// 递归处理树形列表/// </summary>/// <param name="nodes">树节点信息对象</param>/// <param name="pNode">TreeView根节点</param>private void InitTreeNode(List<TreeNodeInfo> nodes, TreeNode pNode){foreach (TreeNodeInfo node in nodes){TreeNode subNode = new TreeNode(node.Text, node.IconIndex, node.IconIndex);subNode.Tag = node.Tag;if (!string.IsNullOrEmpty(node.ForeColor)){//如果节点颜色有值,则修改前景色subNode.ForeColor = ColorTranslator.FromHtml(node.ForeColor);}//递归调用
                InitTreeNode(node.Nodes, subNode);pNode.Nodes.Add(subNode);}}

这里基本不会涉及很多逻辑,我们只需要对树形节点的结构进行遍历展示即可。

其实后端已经给我们处理好很多数据了,包括对节点构建、数据字典的处理,以及每个条件的数量处理都合并一起,它的逻辑还是很多的。

这个部分的逻辑由于代码量比较大,我们可以简化抽取出来一个辅助类处理,这样在需要的地方直接调用辅助类进行处理就可以了。

抽取辅助类后,对处理逻辑的调用简单了很多。

 CustomerHelper helper = new CustomerHelper();var result = helper.GetCustomerTree(userId, companyId, dataFilter, shareUserCondition);

这部分有300多行代码,具体就不再一一介绍了,主要就是对各个接口的处理,获取数据并组装起来。

这种在服务器端对主要逻辑进行封装,简化客户端的处理逻辑,是我们推荐的方式,可以极大的提高界面响应效率,减少不必要的网络延迟损耗,从而提高用户的体验效果,对于具有较高运算速度的服务器,更是物尽其用。

转载于:https://www.cnblogs.com/wuhuacong/p/10531099.html

在混合开发框架模式中,简化客户端对Web API的频繁调用相关推荐

  1. qt框架的开发模式_Flutter 混合开发框架模式探索

    Flutter 混合开发框架模式探索 由于 Google 官方提供的 Flutter 混合式开发方案过于简单,仅支持打开一个 Flutter View 的能力,而不支持路由间传参.统一的生命周期.路由 ...

  2. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  3. 在Docker中运行ASP.NET Web API解决方案

    目录 介绍 先决条件 如何容器化现有项目 添加docker-compose项目 带有docker-compose的容器化解决方案 添加环境变量 后端 前端 不使用Visual Studio运行您的应用 ...

  4. 在Asp.net应用程序中构建基于WCF Web.Api的服务

    WCF Web API Preview 5 发布了,你可以官方网站下载或通过Nuget安装它. 下面让我们在Asp.net applicatoin中来实现一个非常简单的web api service. ...

  5. 在域模式中控制客户端运行和禁止软件

    新装的电脑,别人随便胡乱的运行一些危险的程序弄乱系统?或者我们把聊天.播放的软件"禁锢"起来,使用得家里小孩沉迷娱乐而耽误了学习?再或者公司的员工让他们只能运行公司规定的OFFCI ...

  6. ASP.NET MVC4中调用WEB API的四个方法

    当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各种客户端去使用服务已经是十分普遍的做法.就.NET而言,目前提供了Remoting,WebService和WCF服务,这都能开发出功能十分强 ...

  7. 生成用于ASP.NET Web API的C#客户端API

    目录 介绍 主要特征 主要好处 背景 推定(Presumptions) 使用代码 步骤0:将NuGet软件包WebApiClientGen安装到Web MVC/API项目 步骤1:建立.NET Cli ...

  8. 生成用于ASP.NET Web API的TypeScript客户端API

    目录 介绍 备注 背景 推定(Presumptions) 使用代码 步骤0:将NuGet package WebApiClientGen和WebApiClientGen.jQuery安装到Web AP ...

  9. 在 .NET 中使用 Web API 连接到 MongoD

    from:http://www.oschina.net/translate/connect-to-mongodb-from-dotnet-using-web-api MongoDB是一种非常流行的No ...

  10. 在 .NET 中使用 Web API 连接到 MongoDB

    在 .NET 中使用 Web API 连接到 MongoDB MongoDB是一种非常流行的NoSQL数据库,其用户基数以及功能列表同时都在迅猛增长中. MongoDB可从这里下载安装.如果你并不想为 ...

最新文章

  1. ocr python opencv_如何使用(opencv/python)来实现OCR处
  2. screen实现关闭ssh之后继续运行代码
  3. 微信小程序扫码的代码及获取二维码的url地址
  4. CSS 水平垂直居中
  5. java aqs源码_java中AQS源码分析
  6. java 学习笔记之AtomicInteger类的使用
  7. 【三月专题】Dp专练
  8. Git常用命令及场景
  9. TCP/IP FTP/TFTP
  10. spring中的web上下文,spring上下文,springmvc上下文区别(超详细)
  11. 多模态算法在视频理解中的应用
  12. JVM中的Xms和Xmx
  13. Service Mesh框架选型对比分析:Linkerd、Envoy、Istio、Conduit
  14. Cobalt Strike Malleable C2
  15. C语言练习-day25
  16. 婚礼筹备之WBS工作分解结构(转)
  17. tp路由器 拨号失败 服务器无响应,tp路由器wdr8500拨号不成功怎么办
  18. 【SQL注入-文件读写】文件的读取+写入:函数、使用方法
  19. 新的掌舵手已就位,汽车之家这艘船将驶向何方?
  20. HP Pavilion X360 11-U054TU降级安装Win7总结

热门文章

  1. SQL Server数据库查询速度慢的原因
  2. .Net Compact Framework 高级篇(2)-- 扩展SOAP应用
  3. 11行Python代码,盗取了室友的U盘内容
  4. LOJ P10147 石子合并 题解
  5. 常用数据库及表相关操作语句
  6. python3绝对路径,相对路径
  7. 【AtCoder ABC 075 C】Bridge
  8. static关键字作用总结
  9. 令用EclipseJ2EE创建的Dynamic Web project目录结构与用MyEclipse创建的Web project一样
  10. UVa 621 - Secret Research