在 MVC 应用程序中,我们假设从数据库中动态加载一些字符串。基本上是一个 <string,string>键值字典。每次从数据库加载每个文本都会杀死应用程序,因此这些文本通常只会从数据库中提取一次,然后存储在缓存中(即 Web.HttpContext.Current.Cache )。还有一些硬编码的默认文本,如果在数据库中找不到任何内容,则会使用这些文本。为了使事情更简单,我还将这些默认文本放入缓存中。
逻辑如下:
尝试从缓存中获取文本,如果找到则返回。
如果缓存中没有文本,请尝试从数据库中提取它,如果找到,将其保存到缓存中并返回。
- 如果以上都失败了,使用默认文本并将其保存到缓存中,这样就不会对该特定键进行进一步查询。
如果我理解正确的话,检查 key 是否设置在 Web.HttpContext.Current.Cache 中的唯一方法是通过将它的值与 null 进行比较。我的问题是,默认文本并非完全不可能为空。因此,如果我将其放入缓存中,我将不知道已设置 key ,并且每次需要文本时我都会尝试从数据库中提取不存在的值。
我知道我可以使用空字符串而不是 null,但在不久的将来我可能会因为某些原因需要区分 null 和空字符串。
那么有什么方法可以判断 Web.HttpContext.Current.Cache 中是否设置了一个键?分配的值何时为空?
请您参考如下方法:
StriplingWarrior 先发制人,但我同意他所说的:只需将要存储的内容包装在复杂类型中,以便进行空值检查。通常你会使用 Nullable<T>为此,您不能将 Nullable 类型用于已经被认为可以为 null 的事物,例如字符串。
这是一个实际的例子:
定义一个简单的包装类:
public class CacheEntry<T>
{
public T Value { get; private set; }
public CacheEntry(T value)
{
Value = value;
}
}
然后使用它!
System.Web.HttpContext.Current.Cache.Insert("name", new CacheEntry<string>("Marcin"));
var name = (CacheEntry<string>) System.Web.HttpContext.Current.Cache.Get("name");
if (name != null)
{
Console.WriteLine(name.Value);
}
