2009-06-08 61 views
11

我们正在开发一个.NET 3.5 Windows窗体应用程序,使用LINQ to SQL和MVP。我们有恢复数据的DataRepository类:使用静态变量来缓存数据

public class DbUserRepository : IUserRepository 
{ 
    private IList<UserName> _users; 

    public IList<UserName> GetUserNames() 
    { 
    if (_users == null) 
    { 
     // retrieve _users from DB 
    } 

    return _users; 
    } 

为了缓存跨越DBUserRepository的所有实例的用户列表中,我们将使用企业库的缓存应用程序块。

但它发生在我身上,我不能让_users成为静态成员吗​​?出于某种原因,这看起来像一个“老派”的方式,但它的作品。这样做有什么缺点吗?这被认为是不好的设计?

private static IList<UserName> _users; 

感谢

回答

10

这样做最大的缺点正是由于static意味着什么;尽管您可以有许多DbUserRepository对象,但它们将始终只共享一个_users变量。情况下,这会导致问题:

  • 如果您的应用程序不断变多线程,并希望每个线程都有自己的独特的用户信息库(这是否是一个问题取决于什么的仓库在指你的系统的上下文)

  • 单元测试DbUserRepository类会变得更加棘手,因为如果你对这个类运行多个单元测试,它们将从测试到测试一起运行状态,这意味着测试运行变成顺序依赖...这是非常不可取的

3

为简单的缓存我觉得静态变量是好的,只是需要一点谨慎使用锁来保护多个线程访问_users变量。但是,更好的方法可能是使用ASP.NET缓存类。我知道它在System.Web名称空间中,但您可以使用use it outside of ASP.NET application too

3

几件事情要考虑。初始化变量

  • 的AppDomain的

    1. 线程安全。静态变量对于AppDomain实例是本地的。因此,如果您有多个应用程序域正在运行,您将拥有多个缓存实例

    这些可能对您的应用程序不感兴趣。可能不是,但值得注意。

  • 0

    如果你确实需要超过其中一个,你将不得不花费额外的努力从代码中去掉静态代码,并开始在整个地方传递它。