首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要使用System.Runtime.Caching或System.Web.Caching而不是静态变量呢?

为什么要使用System.Runtime.Caching或System.Web.Caching而不是静态变量呢?
EN

Stack Overflow用户
提问于 2011-05-13 09:50:10
回答 3查看 13.5K关注 0票数 29

Long time listener -首次呼叫者。我希望能得到一些建议。我读过一些关于.net缓存的文章--包括System.Web.Caching和System.Runtime.Caching。我想知道与简单地创建一个带锁的静态变量相比,我可以获得哪些额外的好处。我目前(头脑简单)的缓存方法是这样的:

代码语言:javascript
复制
public class Cache
{
    private static List<Category> _allCategories;
    private static readonly object _lockObject = new object();

    public static List<Category> AllCategories
    {
        get
        {
            lock (_lockObject)
            {
                if (_allCategories == null)
                {
                    _allCategories = //DB CALL TO POPULATE
                }
            }
            return _allCategories;
        }
    }
}

除了过期(我不希望它过期),我不知道使用内置缓存的好处是什么。

也许更复杂的缓存场景对我来说是有好处的--或者我只是错过了一些东西(不是第一次)。

那么,如果我想要一个永不过期的缓存,使用缓存有什么好处呢?静态变量不是这样做的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-13 10:59:17

首先,Xaqron提出了一个很好的观点,即您所讨论的内容可能不符合缓存的要求。它实际上只是一个延迟加载的全局可访问变量。这很好:作为一个实际的程序员,在没有真正好处的情况下,竭尽全力实现全功能缓存是没有意义的。但是,如果您打算使用这种方法,那么您最好是Lazy,让.NET 4来做繁重的工作:

代码语言:javascript
复制
private static Lazy<IEnumerable<Category>> _allCategories
    = new Lazy<IEnumerable<Category>>(() => /* Db call to populate */);

public static IEnumerable<Category> AllCategories 
{ 
    get { return _allCategories.Value; } 
}

我擅自将类型更改为IEnumerable<Category>,以防止调用者认为他们可以添加到此列表中。

也就是说,无论何时访问公共静态成员,您都会错过面向对象编程所提供的许多灵活性。我个人建议你:

  1. 将类重命名为CategoryRepository (或类似的名称),
  2. 使此类实现ICategoryRepository接口,并在接口上使用GetAllCategories()方法,
  3. 将此接口构造函数注入到任何需要它的类中。

<代码>G212

这种方法将使您能够对应该对所有类别执行操作的类进行单元测试,并完全控制要测试的“类别”,而不需要调用数据库。

票数 23
EN

Stack Overflow用户

发布于 2011-05-13 09:55:59

System.Runtime.Caching和System.Web.Caching有自动过期控制,可以基于文件更改,SQL Server DB changes,并且您可以实现自己的“更改提供程序”。您甚至可以在缓存条目之间创建依赖关系。

要了解有关System.Caching名称空间的更多信息,请参阅此链接:

http://msdn.microsoft.com/en-us/library/system.runtime.caching.aspx

我提到的所有功能都记录在链接中。

使用静态变量需要手动控制到期时间,并且必须使用文件系统监视器和缓存命名空间中提供的其他程序。

票数 21
EN

Stack Overflow用户

发布于 2011-05-13 10:17:45

Other than expiration (and I wouldn't want this to expire) ...

如果你不关心生命周期,那么这个名字就不再是caching了。

仍然使用Application (您的情况)和Session object是存储应用程序级和会话级数据的最佳实践。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5986466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档