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

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

1、使用硬编码方式的中文化解析操作

硬编码的方式,中文化字段的操作,是在本地进行的,一般响应会比较快,如下代码所示。

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

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

2、中文化统一解析操作

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

        /// <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的数据访问方式,那么每次访问都会耗费一定的处理时间。

如果我们使用缓存,第二次直接从本地获取,那么速度会提高很多,特别是表的字段参照对象比较多的时候,性能提高更加明显。

3、使用缓存的操作处理

由于.NET提供了MemoryCache对象给我们进行缓存的处理,我们利用它就可以很好实现了,为了方便,我们可以对它进行一定的封装后在使用。

首先,我们希望封装后提供一个通用的对字段中文化的处理函数,传入相应的参数就可以了。因此先封装好一个辅助类。

    /// <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 = "客户信息列表";
        }

时间: 2024-12-14 15:29:39

在WCF数据访问中使用缓存提高Winform字段中文显示速度的相关文章

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

本文较为详细的讲述了在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法,分享给大家供大家参考之用.具体方法如下: 在我们开发基于WCF访问方式的Winform程序的时候,一般情况下需要对界面显示的字段进行中文显示的解析.如果是硬编码进行中文显示,那么除了不方便调整及代码臃肿外,性能上没有什么问题,但是不建议这样处理:一般情况下,我们把中文对照信息放到业务类里面去统一解析,但是这样会导致每次WCF访问方式请求解析中文化的操作耗费一定的响应时间.如果使用缓存存储中文字段的对照表,那么

实验7 寻址方式在结构化数据访问中的应用

题目让我们按下图要求的格式: 直接上代码. 1 ;实验7 殉职方式在结构话数据访问中的应用 2 3 ;编程,将data段中的数据按题中给出图的格式写入到table段中,并计算21年中的人均收入(取整) 4 ;结果也按照题中图给出的格式保存在table段中. 5 ;程序如下 6 7 assume cs:codesg 8 9 data segment 10 db '1975','1976','1977','1978','1979','1980','1981','1982','1983' 11 db

删除数据表中除id外其他字段相同的冗余信息

删除一个信息表中除id外其他字段都相同的冗余信息,如下 id name addr 1 a b 2 a b 3 b c 删除这个表中的冗余信息 即应该是 id name addr 1 a b 3 b c 设table为t Sql:delete from tableName where id not in (select min(id) from tableName group by name, addr…)

在Delphi中处理数据库日期型字段的显示与输入

delphi进行数据库设计时,不可避免的会涉及到日期型字段的输入问题.不过与Microsoft的Access 97中文版等相比,Delphi本身提供的日期型字段的显示和输入方式并不适合中国人的习惯.因此对于日期型字段的处理,大家提出了不少解决方法,但是处理结果在显示和输入上并不统一,例如显示时可以实现“yyyy年mm月dd日”的格式,但是在输入时还是要按照国外的习惯用“yyyy-mm-dd”的形式进行输入:而使用TdateTimePicker进行选择输入总嫌麻烦:有些方法还要修改系统的一些设置属

汇编试验七:寻址方式在结构化数据访问中的应用

预备知识: (1)寻址方式 <汇编语言>P169 (2)div指令 被除数 dx + ax,除数 bx ,商 ax,dx 余数: (3)dd :双字数据 (4)dup :重复赋值指令

汇编语言: 实验七 寻址方式在结构化数据访问中的应用

assume cs:code,ds:data,ss:stackdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995'dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,14

数据访问(登录数据库查询内容在网页显示)

查询某个数据库的内容的话,建个HTML文件,然后建个from表单,例子如下. <form action="./loginchuli.php" method="post"> <div>用户名:<input type="text" name="uid" /></div> <div>密码:<input type="password" name=&q

在JSP中获取oracle中的时间戳类型的字段并显示

在oracle中有一种特殊的时间显示类型——Timestamp时间戳 通常我们将当前时间转化为时间戳的语法如下: select cast (sysdate as timestamp ) from dual 在一个JSP页面中,需要获取一个时间戳字段,以显示在页面上 首先,是对JDBC的操作 sql语句用: select * from testlibrary 假设testlibrary中的modifydate字段的类型为TIMESTAMP(6) Testlibrary tlb= new Testl

Sql语句 表中相同的记录(某个字段)只显示一条,按照时间排序显示最大或最小

原始表数据: 想要的结果数据为: sql语句: select * from Table_1 where DT in(select min(DT)   from Table_1 group by AccountID)  --DT为时间字段