在WCF数据访问中使用缓存提高Winform字段中文显示速度的方法
本文较为详细的讲述了在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 = "客户信息列表"; }
运行如下图所示: