95992828九五至尊2

API应用架构在Winform混合框架中的应用,系统级别字典和公司级别字典并存的处理格局

二月 6th, 2019  |  882828九五至尊手机版

在自身那一个连串中,我首要以自我正在开发的云会员管理连串为例进行介绍Web
API的采纳,由于云会员的多寡安排是支持三个集团铺面,而各类商家又足以涵盖四个商店的,因而有的字典型的数目需求考虑那地点的两样。如对于证书类型,收费处理状态,民族,职称等这几个固定化的情节,大家得以松开大局字典里面,不过对于部分如会员相关的字典数据,如产品单位、产品档次等情节,假若也一切规定为全局的连串字典,那么就不够灵活性,这么些数据应该可以由个别举行差别化处理。

在自家这些连串中,我最紧要以自身正在开发的云会员管理系列为例进行介绍Web
API的施用,由于云会员的多寡计划是支撑四个集团公司,而各种集团又能够包含八个商店的,因而有些字典型的数目须要考虑那位置的分化。如对于证件类型,收费处理意况,民族,职称等那些固定化的内容,大家可以停放全局字典里面,然而对于一些如会员相关的字典数据,如出品单位、产品门类等情节,如若也全体规定为全局的系统字典,那么就不够灵活性,这个多少应该可以由个别举办差别化处理。

1、云会员系统的字典数据模型

俺们先来领会下基于Web API接口的云会员管理连串的共同体界面效果。

图片 1

是因为一般的云会员系统,都是允许用户注册一个商店,然后集团规模开设四个商铺的,如系统的登陆界面如下所示。

图片 2

故此数据的范围须求考虑的更广,他们的关系如下所示。

图片 3

而我辈原来布置的字典模型如下所示。

图片 4

而在公司数目这么些层次上,大家须要考虑集团层级的多寡字典存储,不过大家尤其分析可以观察,即使数额字典数据是商店层级的,不过数量字典的品类(如证件类型、产品序列等)那么些是一定不变的,也就是我们即使存储公司层级的字典数据,那么也只是亟需仓储对应的字典项目即可。由此大家得以追加多一个和TB_DictData的数额表类似的表举行仓储即可,它的多少布置如下所示。

图片 5

为了便于在系统内部使用同一的字典项目内容,大家成立一了一个联结的字典项目管理模块,也就是系统字典管理界面,如下所示。

图片 6

 

1、云会员系统的字典数据模型

咱俩先来了然下基于Web API接口的云会员管理连串的总体界面效果。

图片 7

是因为一般的云会员系统,都是允许用户注册一个店铺,然后公司层面开设两个商铺的,如系统的登陆界面如下所示。

图片 8

为此数据的界定必要考虑的更广,他们的关联如下所示。

图片 9

而我辈本来安排的字典模型如下所示。

图片 10

而在店堂数量那一个层次上,大家必要考虑集团层级的数量字典存储,可是大家越来越分析可以见到,即使数额字典数据是公司层级的,可是数量字典的档次(如证件类型、产品门类等)这一个是一直不变的,也就是我们只要存储公司层级的字典数据,那么也只是亟需仓储对应的字典项目即可。由此我们得以扩充多一个和TB_DictData的多寡表类似的表举行仓储即可,它的数据安顿如下所示。

图片 11

为了方便在系统内部使用同一的字典项目内容,我们创造一了一个合并的字典项目管理模块,也就是系统字典管理界面,如下所示。

图片 12

2、公司层级的字典数据存储已毕

有了地点的布署性模型,相信大多数人手都可以想到它的切切实实贯彻思路了。

率先大家须要以种类字典数据为参照,如默认就是取系统的字典项目数目,即使集团级其余用户修改或者去除了字典数据内容,那么相应的字典类其他字典项目就活该以修改的为准了。

只是大家不可能为新建公司账户的时候,都为各类商家机关创制一份对应类型的字典数据,那样稍显麻烦,而且一初始就创办也正如艰辛。

先成立一个企业字典的数码管理界面,它和字典数据管理界面一样,然而是储存在此外一个表里面,自动按照当下用户的店家标识举办仓储的。

图片 13

批量添加公司字典的数码如下所示。

图片 14

相似我们在行使公司层级的字典数据或者系统公共层级的字典数据的时候,都是基于字典类型举行判断的。

由此在店堂层级依据字典项目项目获取数据的时候,我们在作业接口底层做了判断,判断假若对应公司的字典项尚未多少,则复制一份过去,如若公司层次有对应的数据类型,那么就赢得集团层级的字典项目数量即可。

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

        /// <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)–系统级别字典和商家级别字典并存的处理方式

 

2、公司层级的字典数据存储达成

有了地点的规划模型,相信一大半人员都足以想到它的切实可行落实思路了。
率先我们须求以种类字典数据为参照,如默许就是取系统的字典项目数目,假诺集团级其他用户修改或者去除了字典数据内容,那么相应的字典类其他字典项目就活该以修改的为准了。
不过大家不可以为新建公司账户的时候,都为各种集团机关创立一份对应类型的字典数据,那样稍显麻烦,而且一初阶就创办也相比劳顿。
先创立一个店家字典的多少管理界面,它和字典数据管理界面一样,可是是储存在其它一个表里面,自动依据当下用户的同盟社标识举办仓储的。

图片 15

批量添加公司字典的数额如下所示。

图片 16

诚如大家在使用集团层级的字典数据仍旧系统共用层级的字典数据的时候,都是基于字典类型举行判断的。
因此在公司层级依照字典项目项目获取数据的时候,大家在工作接口底层做了判断,判断借使对应集团的字典项尚未数量,则复制一份过去,即使商家层次有对应的数据类型,那么就赢得公司层级的字典项目数量即可。
实际的代码逻辑如下所示。

/// <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);
}

上述就是一个全体性的思路,并在系统中可见顺利解决难题的做法,希望我们能够借鉴。

Your Comments

近期评论

    功能


    网站地图xml地图