这个示例展示了一个简单的内存缓存实现,展示了自定义缓存的基础知识,不应该在生产环境中使用。
在文档服务源代码中,替换其中的代码ServiceHelper。CreateCache
:
_cache =新MemoryCache ()
cs(将这个测试类添加到文档服务项目中)
使用Leadtools.Caching;
使用系统;
使用System.Collections.Concurrent;
使用System.Collections.Generic;
名称空间MyNamespace
{
公共类MemoryCache: ObjectCache
{
//缓存。字符串|对象的并发字典
私人ConcurrentDictionary最后<字符串,对象> _cache =新ConcurrentDictionary最后<字符串,对象> ();
//
//这些成员必须由我们的类实现,并由Document工具箱调用
//
//我们的名字
公共覆盖字符串名字
{
得到
{
返回“内存缓存”;
}
}
//我们只支持二进制序列化。实际上,我们既不支持策略也不支持序列化,但是我们返回Binary
//通知任何呼叫者不要给我们发送任何JSON数据
公共覆盖CacheSerializationMode PolicySerializationMode
{
得到
{
返回CacheSerializationMode.Binary;
}
集
{
扔新NotSupportedException(由于);
}
}
公共覆盖CacheSerializationMode DataSerializationMode
{
得到
{
返回CacheSerializationMode.Binary;
}
集
{
扔新NotSupportedException(由于);
}
}
//我们没有特别的额外支持
公共覆盖DefaultCacheCapabilities DefaultCacheCapabilities
{
得到
{
返回DefaultCacheCapabilities.None;
}
}
公共覆盖CacheItem
AddOrGetExisting (CacheItem item, CacheItemPolicy policy) {
如果(项目= =零)
扔新ArgumentNullException (“项目”);
//解析键,记住,我们没有区域
varResolveKey = ResolveKey(项目。RegionName item.Key);
CacheItem
oldItem =零; //尝试获取旧值
//是的,保存旧值返回给用户
对象oldPayload;
如果(_cache。TryGetValue (resolvedKey出oldPayload))
oldItem =新CacheItem < T >(项目。Key, (T)oldPayload, item.RegionName);
//设置新数据
_cache。TryAdd (resolvedKey item.Value);
//返回旧项目
返回oldItem;
}
公共覆盖CacheItem < T > GetCacheItem < T > (字符串键,字符串regionName)
{
//如果我们有一个带有此键的项,则返回它。否则,返回null
varresolvedKey = ResolveKey(regionName, key);
CacheItem
item =零; 对象有效载荷;
如果(_cache。TryGetValue (resolvedKey出有效载荷)
项=新CacheItem
(key, (T)payload, regionName); 返回项;
}
公共覆盖保龄球包含(字符串键,字符串regionName)
{
//检查键是否在字典中
varresolvedKey = ResolveKey(regionName, key);
varexists = _cache.ContainsKey(resolvedKey);
返回存在;
}
公共覆盖保龄球UpdateCacheItem < T > (CacheItem < T >项)
{
//更新项目
如果(项目= =零)
扔新ArgumentNullException (“项目”);
varResolveKey = ResolveKey(项目。RegionName item.Key);
varexists = _cache.ContainsKey(resolvedKey);
如果(存在)
_cache[resolvedKey] = item.Value;
返回存在;
}
公共覆盖T删除< T > (字符串键,字符串regionName)
{
//如果存在,则返回旧值
varresolvedKey = ResolveKey(regionName, key);
对象有效载荷;
varremove = _cache。TryRemove (resolvedKey出有效载荷);
返回删除吗?(T)有效载荷:默认的(T);
}
公共覆盖无效DeleteItem (字符串键,字符串regionName)
{
//如果存在则删除
varresolvedKey = ResolveKey(regionName, key);
对象有效载荷;
_cache。TryRemove (resolvedKey出有效载荷);
}
私人静态字符串ResolveKey (字符串regionName,字符串键)
{
//两个字符串都必须为非空字符串
如果(字符串.IsNullOrEmpty (regionName))扔新InvalidOperationException (“地区名称必须是非空字符串”);
如果(字符串.IsNullOrEmpty(关键))扔新InvalidOperationException ("区域键名必须是非空字符串");
//我们是一个没有分组的简单字典。regionName可能不是唯一的,key也可能不是唯一的,而是将它们组合在一起
//我们保证有一个唯一的密钥
返回regionName +“-”+关键;
}
公共覆盖无效UpdatePolicy (字符串key, CacheItemPolicy策略字符串regionName)
{
//无事可做
}
//
//这些成员必须由我们的类过度实现,但绝不会被Documents工具包调用
//抛出一个不支持的异常
//
//这是默认区域支持。我们没有
公共覆盖对象这[字符串例子)
{
得到
{
扔新NotSupportedException(由于);
}
集
{
扔新NotSupportedException(由于);
}
}
//一次性删除一个区域我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities.CacheRegions时才会被调用。因为我们不这样做,所以调用者负责
//调用DeleteAll传递区域的所有项目(依次调用每个项目的DeleteItem)
公共覆盖无效DeleteRegion (字符串regionName)
{
扔新NotSupportedException(由于);
}
//开始添加外部资源我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖Uri BeginAddExternalResource (字符串键,字符串regionName,保龄球读写)
{
扔新NotSupportedException(由于);
}
//结束添加外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖无效EndAddExternalResource < T > (保龄球提交,字符串key, T值,CacheItemPolicy策略,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取项目外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖Uri GetItemExternalResource (字符串键,字符串regionName,保龄球读写)
{
扔新NotSupportedException(由于);
}
//删除项目外部资源。我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。ExternalResources
公共覆盖无效RemoveItemExternalResource (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取项目虚拟目录路径我们对此不支持
//注意:只有当我们有DefaultCacheCapabilities时才会调用。VirtualDirectory
公共覆盖Uri GetItemVirtualDirectoryUrl (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取缓存中的条目数。我们对此不支持
公共覆盖长GetCount (字符串regionName)
{
扔新NotSupportedException(由于);
}
/ /统计数据。我们对此不支持
公共覆盖CacheStatistics GetStatistics ()
{
扔新NotSupportedException(由于);
}
/ /统计数据。我们对此不支持
公共覆盖CacheStatistics GetStatistics (字符串键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//获取所有的值。我们对此不支持
公共覆盖IDictionary <字符串,对象> getvalue (IEnumerable <字符串>键,字符串regionName)
{
扔新NotSupportedException(由于);
}
//项目的枚举。我们对此不支持
受保护的覆盖IEnumerator < KeyValuePair <字符串,对象> > GetEnumerator ()
{
扔新NotSupportedException(由于);
}
//键的枚举我们对此不支持
公共覆盖无效EnumerateKeys (字符串区域,EnumerateCacheEntriesCallback
{
扔新NotSupportedException(由于);
}
//区域的枚举。我们对此不支持
公共覆盖无效EnumerateRegions (EnumerateCacheEntriesCallback回调)
{
扔新NotSupportedException(由于);
}
}
}
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗网络查看器net
188宝金博怎么下载
支持的平台上
.NET、Java、Android和iOS/macOS程序集
C API/ c++类库
HTML5 JavaScript库
您的邮件已发送给技术支持!应该有人联系!如果你的事情很紧急,请回来聊天。
聊天时间:
周一至周五,美国东部时间上午8:30至下午6:00
感谢您的反馈!
请再次填写表格,开始新的聊天。
所有代理目前都离线。
聊天时间:
星期一至星期五
美国东部时间上午8:30 -下午6点
如需与我们联系,请填写此表格,我们将通过电子邮件与您联系。