API应用架构在Winform混合框架中的应用

在自家那一个连串中,我首要以自小编正在开发的云会员管理种类为例举办介绍Web
API的施用,由于云会员的数码陈设是永葆三个铺面集团,而各样集团又可以包罗多少个合营社的,由此有个别字典型的多寡须要考虑那地点的两样。如对于注解类型,收费处理状态,民族,职称等这么些固定化的始末,大家可以放置大局字典里面,但是对于部分如会员相关的字典数据,如产品单位、产品品类等情节,即使也漫天分明为大局的连串字典,那么就缺少灵活性,那些多少应该可以由各自进行差距化处理。

一,云会员系统的字典数据模型

咱俩先来打听下基于Web API接口的云会员管理种类的共同体界面效果。

bifa365必发 1

是因为一般的云会员系统,都以允许用户注册一个合营社,然后公司范围开设七个商铺的,如系统的登陆界面如下所示。

bifa365必发 2

从而数据的限制须求考虑的更广,他们的关系如下所示。

bifa365必发 3

而我们本来规划的字典模型如下所示。

bifa365必发 4

而在店堂数目这些层次上,我们要求考虑企业层级的多少字典存储,不过大家尤其分析可以看看,即使数额字典数据是集团层级的,不过数量字典的类型(如证件类型、产品门类等)那些是一直不变的,相当于大家只要存储公司层级的字典数据,那么也只是亟需仓储对应的字典项目即可。因而我们得以追加多一个和TB_DictData的数目表类似的表展开仓储即可,它的数码布署如下所示。

bifa365必发 5

为了便利在系统里头使用同样的字典项目内容,我们成立一了1个联结的字典项目管理模块,相当于系统字典管理界面,如下所示。

bifa365必发 6

bifa365必发, 

2、集团层级的字典数据存储达成

有了地点的筹划模型,相信半数以上人口都足以想到它的切实可行已毕思路了。

首先大家须要以连串字典数据为参考,如默许就是取系统的字典项目数量,即便商家级其余用户修改或然去除了字典数据内容,那么相应的字典类其余字典项目就相应以修改的为准了。

但是大家不可以为新建公司账户的时候,都为各种公司机关创设一份对应类型的字典数据,那样稍显麻烦,而且一初始就创办也相比费心。

先创造2个商店字典的数额管理界面,它和字典数据管理界面一样,可是是储存在其它八个表里面,自动依据如今用户的信用社标识进行仓储的。

bifa365必发 7

批量添加集团字典的数码如下所示。

bifa365必发 8

貌似大家在利用公司层级的字典数据仍然系统共用层级的字典数据的时候,都以依照字典类型进行判定的。

从而在铺子层级依据字典项目体系获取数据的时候,大家在事情接口底层做了判断,判断假诺对应公司的字典项尚未数量,则复制一份过去,倘若商户层次有照应的数据类型,那么就收获公司层级的字典项目数目即可。

实际的代码逻辑如下所示。

        /// <summary>
        /// 根据字典类型名称获取所有该类型的字典列表集合
        /// </summary>
        /// <param name="dictType">字典类型名称</param>
        /// <param name="corpId">公司ID</param>
        /// <returns></returns>
        public List<CorpDictDataInfo> FindByDictType(string dictTypeName, string corpId)
        {
            ICorpDictData dal = baseDal as ICorpDictData;
            List<CorpDictDataInfo> list = dal.FindByDictType(dictTypeName, corpId);

            //如果公司字典没有数据,则从系统字典获取
            if (list.Count == 0)
            {
                List<DictDataInfo> dict = BLLFactory<DictData>.Instance.FindByDictType(dictTypeName);
                foreach (DictDataInfo info in dict)
                {
                    list.Add(new CorpDictDataInfo(info, corpId));                    
                }

                //写入公司字典表,避免下次再去获取
                foreach (CorpDictDataInfo info in list)
                {
                    baseDal.Insert(info);
                }
            }
            return list;
        }

在Web API的控制器接口,依旧和其它的拍卖一样,增添对应的参数处理即可。

        /// <summary>
        /// 根据字典类型名称获取所有该类型的字典列表集合
        /// </summary>
        /// <param name="dictType">字典类型名称</param>
        /// <param name="corpId">公司ID</param>
        /// <returns></returns>
        [HttpGet]
        public List<CorpDictDataInfo> FindByDictType(string dictTypeName, string corpId, string token)
        {          
            //令牌检查,不通过则抛出异常
            CheckResult checkResult = CheckToken(token);

            return BLLFactory<CorpDictData>.Instance.FindByDictType(dictTypeName, corpId);
        }

 

在Facade层定义字典的应和接口的时候,我们的代码如下所示

        /// <summary>
        /// 根据字典类型名称获取所有该类型的字典列表集合
        /// </summary>
        /// <param name="dictType">字典类型名称</param>
        /// <param name="corpId">公司ID</param>
        /// <returns></returns>
        [OperationContract]
        List<CorpDictDataInfo> FindByDictType(string dictTypeName, string corpId);

在根据Web API的包装调用接口,大家的调用封装类如下所示。其中token以及Web
API的连带参数处理,在基类模块进行了打包,减弱了不计其数代码的拼凑。

     /// </summary>
        /// <param name="dictType">字典类型名称</param>
        /// <param name="corpId">公司ID</param>
        /// <returns></returns>
        public List<CorpDictDataInfo> FindByDictType(string dictTypeName, string corpId)
        {
            var action = "FindByDictType";
            string url = GetTokenUrl(action) + string.Format("&dictTypeName={0}&corpId={1}", dictTypeName, corpId);

            List<CorpDictDataInfo> result = JsonHelper<List<CorpDictDataInfo>>.ConvertJson(url);
            return result;
        }

然后大家在界面上的字典项目下拉列表,则足以透过增添函数的法门展开绑定。

        /// <summary>
        /// 初始化字典列表内容
        /// </summary>
        private void InitDictItem()
        {
            //初始化代码
            this.txtProductType.BindDictItemsByCorp("会员产品类型", LoginUserInfo.CompanyId);
        }

        /// <summary>
        /// 绑定下拉列表控件为指定的数据字典列表[如果公司字典记录不存在,则使用系统字典记录,否则使用公司记录]
        /// </summary>
        /// <param name="combo">下拉列表控件</param>
        /// <param name="dictTypeName">数据字典类型名称</param>
        public static void BindDictItemsByCorp(this ComboBoxEdit combo, string dictTypeName, string corpId)
        {
            BindDictItemsByCorp(combo, dictTypeName, corpId, null);
        }

        /// <summary>
        /// 绑定下拉列表控件为指定的数据字典列表[如果公司字典记录不存在,则使用系统字典记录,否则使用公司记录]
        /// </summary>
        /// <param name="combo">下拉列表控件</param>
        /// <param name="dictTypeName">数据字典类型名称</param>
        /// <param name="defaultValue">控件默认值</param>
        public static void BindDictItemsByCorp(this ComboBoxEdit combo, string dictTypeName, string corpId, string defaultValue)
        {
            Dictionary<string, string> dict = CallerFactory<ICorpDictDataService>.Instance.GetDictByDictType(dictTypeName, corpId);
            List<CListItem> itemList = new List<CListItem>();
            foreach (string key in dict.Keys)
            {
                itemList.Add(new CListItem(key, dict[key]));
            }

            BindDictItems(combo, itemList, defaultValue);
        }

上述就是一个全部性的思路,并在系统中可以得手化解难题的做法,希望大家可以借鉴。

 

不可枚举文章如下所示:

Web
API应用架构在Winform混合框架中的应用(1)

Web
API应用架构在Winform混合框架中的应用(2)–自定义格外结果的处理

Web
API接口设计经验总计
 

Web
API应用架构在Winform混合框架中的应用(3)–Winfrom界面调用WebAPI的长河分解

 Web
API应用架构在Winform混合框架中的应用(4)–利用代码生成工具飞速支付总体应用

Web
API应用架构在Winform混合框架中的应用(5)–系统级别字典和商行级别字典并存的处理格局

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注