在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開發框架、微信門戶開發框架的研究及應用。
  轉載請註明出處:
撰寫人:伍華聰  
相關文章
相關標籤/搜索