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

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

一、树形结构展现效果

以下面的CRM客户关系管理系统中,咱们须要展现不少客户相关的树形节点,以方便快捷查询相关类型的客户信息。数据库

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

所以若是在客户端整合逻辑,那么须要对几个不一样的处理接口进行调用并处理,这种解析起来比较慢,并且也会致使处理效率问题。服务器

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

 

二、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端的控制器方法以下所示。优化

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

        /// <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多行代码,具体就再也不一一介绍了,主要就是对各个接口的处理,获取数据并组装起来。

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

相关文章
相关标签/搜索