在WCF数据访问中使用缓存提升Winform字段中文显示速度

在WCF数据访问中使用缓存提升Winform字段中文显示速度

在咱们开发基于WCF访问方式的Winform程序的时候,通常状况下须要对界面显示的字段进行中文显示的解析。若是是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,可是不建议这样处理;通常状况下,咱们把中文对照信息放到业务类里面去统一解析,可是这样会致使每次WCF访问方式请求解析中文化的操做耗费必定的响应时间。若是使用缓存存储中文字段的对照表,那么就不用每次请求WCF的数据访问,减小一些响应时间的消耗,提升用户体验效果。

在咱们开发基于WCF访问方式的Winform程序的时候,通常状况下须要对界面显示的字段进行中文显示的解析。若是是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,可是不建议这样处理;通常状况下,咱们把中文对照信息放到业务类里面去统一解析,可是这样会致使每次WCF访问方式请求解析中文化的操做耗费必定的响应时间。若是使用缓存存储中文字段的对照表,那么就不用每次请求WCF的数据访问,减小一些响应时间的消耗,提升用户体验效果。缓存

一、使用硬编码方式的中文化解析操做

硬编码的方式,中文化字段的操做,是在本地进行的,通常响应会比较快,以下代码所示。微信

        public void BindData()
        {
            #region 添加别名解析
            this.winGridViewPager1.DisplayColumns = "ID,User_ID,LoginName,FullName,Note,IPAddress,MacAddress,SystemType_ID,LastUpdated";
            this.winGridViewPager1.AddColumnAlias("ID", "编号");
            this.winGridViewPager1.AddColumnAlias("User_ID", "登陆用户ID");
            this.winGridViewPager1.AddColumnAlias("LoginName", "登陆名");
            this.winGridViewPager1.AddColumnAlias("FullName", "真实名称");
            this.winGridViewPager1.AddColumnAlias("Note", "日志描述");
            this.winGridViewPager1.AddColumnAlias("IPAddress", "IP地址");
            this.winGridViewPager1.AddColumnAlias("MacAddress", "Mac地址");
            this.winGridViewPager1.AddColumnAlias("LastUpdated", "记录日期");
            this.winGridViewPager1.AddColumnAlias("SystemType_ID", "系统类型");

            #endregion

            string where = GetConditionSql();
            PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo;
            List<LoginLogInfo> list = CallerFactory<ILoginLogService>.Instance.FindWithPager(where, ref pagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<LoginLogInfo>(list);
        }

只是这种方式弹性化不太好,若是字段比较多,在界面里面就有不少这样的代码,并且若是多处有这样的解析,就很差控制解析字段名称的一致性。框架

二、中文化统一解析操做

为了克服第一种方案的弊端,咱们能够把中文化参考的操做移到底层DAL去实现,高一层的接口,只须要调用它进行解析(方法GetColumnNameAlias)就能够了。ide

        /// <summary>
        /// 绑定列表数据
        /// </summary>
        private void BindData()
        {
            this.winGridViewPager1.DisplayColumns = "HandNo,CardNo,CardStatus,CardGrade,Name,Sex,Telephone,Mobile,OpenDate,ValidateDate,Discount,Balance,MaxCount,Creator,CreateTime";
            this.winGridViewPager1.ColumnNameAlias = CallerFactory<IMemberService>.Instance.GetColumnNameAlias();//字段列显示名称转义

            string where = GetConditionSql();
            List<MemberInfo> list = CallerFactory<IMemberService>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<MemberInfo>(list);
            this.winGridViewPager1.PrintTitle = "会员信息报表";
         }

这样处理后,解析的统一性提升了,代码也简化了不少,基本上达到了咱们指望的效果。可是惟一的问题就是若是是WCF的数据访问方式,那么每次访问都会耗费必定的处理时间。函数

若是咱们使用缓存,第二次直接从本地获取,那么速度会提升不少,特别是表的字段参照对象比较多的时候,性能提升更加明显。工具

三、使用缓存的操做处理

因为.NET提供了MemoryCache对象给咱们进行缓存的处理,咱们利用它就能够很好实现了,为了方便,咱们能够对它进行必定的封装后在使用。性能

首先,咱们但愿封装后提供一个通用的对字段中文化的处理函数,传入相应的参数就能够了。所以先封装好一个辅助类。this

    /// <summary>
    /// 提供一些常见操做的缓存处理
    /// </summary>
    public class CacheDataUtil<T> where T : BaseEntity
    {
        /// <summary>
        /// 获取指定对象的别名
        /// </summary>
        /// <typeparam name="T">实体类信息</typeparam>
        /// <param name="service">接口服务对象</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetColumnNameAlias(IBaseService<T> service)
        {
            System.Reflection.MethodBase method = System.Reflection.MethodBase.GetCurrentMethod();
            string key = string.Format("{0}-{1}-{2}", method.DeclaringType.FullName, method.Name, typeof(T).Name);

            return MemoryCacheHelper.GetCacheItem<Dictionary<string, string>>(
                key,
                delegate() { return service.GetColumnNameAlias(); },    
                new TimeSpan(24, 0, 0));//24小时,即1天后过时
        }

    }

而后在主体界面里面,咱们绑定分页控件的处理代码以下所示便可。编码

        /// <summary>
        /// 绑定列表数据
        /// </summary>
        private void BindData()
        {
            //entity
            this.winGridViewPager1.DisplayColumns = displayColumns;       
            //this.winGridViewPager1.ColumnNameAlias = CallerFactory<ICustomerService>.Instance.GetColumnNameAlias();//字段列显示名称转义
            //使用缓存存储表的别名,能够有效提升二次显示速度
            this.winGridViewPager1.ColumnNameAlias = CacheDataUtil<CustomerInfo>.GetColumnNameAlias(CallerFactory<ICustomerService>.Instance);//字段列显示名称转义

            string where = GetConditionSql();
            PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo;
            List<CustomerInfo> list = CallerFactory<ICustomerService>.Instance.FindWithPager(where, ref pagerInfo);
            this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<CustomerInfo>(list);
            this.winGridViewPager1.PrintTitle = "客户信息列表";
        }

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 

主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
专一于Winform开发框架/混合式开发框架、Web开发框架、Bootstrap开发框架、微信门户开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  
相关文章
相关标签/搜索