DotNetNuke 5.0中隐藏的亮点之一是CBO(自定义业务对象)类中的新缓存支持。在为寒武纪版本重构DotNetNuke期间,缓存是被密切关注的事情之一,因为缓存开始在DNN 4中引起主要问题。x分支。
让我们来看看DNN 4中的缓存是如何完成的:
公共共享函数GetSecureHostSettings ()作为哈希表昏暗的h作为哈希表h =CType加上了DataCache(。GetCache (“GetSecureHostSettings”)、散列表)如果h是没有什么然后h =新哈希表昏暗的SettingName作为字符串昏暗的博士作为IDataReader = DataProvider.Instance().GetHostSettings而dr.Read ()如果不Convert.ToBoolean博士((2))然后setingname = dr.GetString(0)如果SettingName.ToLower.IndexOf (“密码”) = -1然后如果不dr.IsDBNull (1)然后h.Add (SettingName dr.GetString (1))其他的h.Add (SettingName”“)结束如果结束如果结束如果结束而加上了DataCache dr.Close()。SetCache (“GetSecureHostSettings”h)结束如果返回h结束函数
这是DNN 4.9.3中DotNetNuke.Entities.Host.HostSettings类的代码。事实上,这是在dnn3的整个应用程序中使用的模式。X - 4.x。这种模式的问题是,它不是完全线程安全的,特别是在较大的例程中使用时,特别是在大型和繁忙的站点上。当您想要使用从缓存中获得的对象时,可能有可能从缓存中删除该对象。
在DotNetNuke 5。x版本中,CBO类增加了一个新的缓存功能:
公共共享函数GetCachedObject (TObject) (按值传递cacheItemArgs作为CacheItemArgs,按值传递cacheItemExpired作为CacheItemExpiredCallback)作为TObject返回DataCache。GetCachedData(Of TObject)(cacheItemArgs, cacheItemExpired)结束函数
然后调用DataCache的一个新方法GetCachedData。这个方法看起来像这样:
公共共享函数GetCachedData (TObject) (按值传递cacheItemArgs作为CacheItemArgs,按值传递cacheItemExpired作为CacheItemExpiredCallback)作为TObject声明局部变量并尝试从缓存中检索它昏暗的objObject作为对象= GetCache (cacheItemArgs.CacheKey)昏暗的超时作为整数= cacheItemArgs。CacheTimeOut * Convert.ToInt32(host . performancessetting)'如果项目没有被缓存如果objObject是没有什么然后当我们重新生成缓存时,阻止其他线程进入该块SyncLockobjLock尝试再次从缓存中检索对象(如果另一个线程在我们第一次检查后加载了该对象)objobobject = GetCache(cacheItemArgs.CacheKey)如果objObject是没有什么然后使用委托从数据源获取对象objobobject = cacheItemExpired(cacheItemArgs)如果objObject不是没有什么需要说明timeOut > 0然后DataCache.SetCache (cacheItemArgs。CacheKey,objObject,cacheItemArgs.CacheDependency,缓存。NoAbsoluteExpiration, _ TimeSpan.FromMinutes(timeOut), cacheItemArgs。CachePriority cacheItemArgs.CacheCallback)检查Item是否实际保存在缓存中如果DataCache.GetCache (cacheItemArgs.CacheKey)是没有什么然后昏暗的objEventLogInfo作为新LogInfo objEventLogInfo。LogTypeKey = EventLogController.EventLogType.CACHE_ERROR.ToString() objEventLogInfo.LogProperties.Add()新LogDetailInfo (cacheItemArgs。CacheKey,“没有了”))昏暗的objEventLog作为新EventLogController () objEventLog.AddLog (objEventLogInfo)结束如果ElseIfobjObject是没有什么然后返回没有什么结束如果结束如果结束SyncLock结束如果返回DirectCast(objObject TObject)结束函数
正如你所看到的,这基本上仍然与DNN 3.x/4中的“旧”模式相同。X,但是,有一些增强:
- 线程安全。使用Synlock,可以防止其他线程在处理对象时入侵
- 使用自动回调,当在缓存中没有找到对象时将调用该回调
- 检查以确保对象已正确保存到缓存
作为使用新模式的一个示例,让我们看看Host。在DNN 5中修改了GetSecureHostSettings:
公共共享函数GetSecureHostSettingsDictionary ()作为词典(字符串,字符串)返回国会预算办公室。(GetCachedObject(字典字符串,字符串)) (新加上了DataCache CacheItemArgs(。SecureHostSettingsCacheKey, _ DataCache。_ DataCache.HostSettingsCachePriority), _AddressOfGetSecureHostSettingsDictionaryCallBack)结束函数
以及相应的回调函数:
私人共享函数GetSecureHostSettingsDictionaryCallBack (按值传递cacheItemArgs作为CacheItemArgs)作为对象昏暗的dicSettings作为新词典(字符串,字符串)昏暗的博士作为IDataReader = DataProvider.Instance().GetHostSettings试一试而dr.Read ()如果不Convert.ToBoolean博士((2))然后昏暗的settingName作为字符串= dr.GetString (0)如果settingName.ToLower.IndexOf (“密码”) = -1然后如果不dr.IsDBNull (1)然后dicSettings。添加(settingName dr.GetString (1))其他的dicSettings。添加(settingName”“)结束如果结束如果结束如果结束而最后如果不博士是没有什么然后dr.Close ()结束如果结束试一试返回dicSettings结束函数
正如您所看到的,回调函数GetSecureHostSettingsDictionaryCallBack本质上与旧方法相同,只是去掉了缓存逻辑。使用这种模式在您自己的模块中使用缓存要容易得多。只需要几行代码就可以了。