问题 使用静态变量来缓存数据


我们正在使用LINQ to SQL和MVP开发.NET 3.5 Windows Forms应用程序。我们有一个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;

谢谢


10754
2018-06-08 22:19


起源



答案:


这样做的最大缺点正是由于什么原因 static 手段;虽然你可以有很多 DbUserRepository 对象,它们总是只共享一个 _users 变量。导致问题的案例:

  • 如果您的应用程序变得多线程,并且您希望每个线程都有自己独特的用户存储库(无论这是否是一个问题取决于存储库在您的系统上下文中的含义)

  • 单元测试 DbUserRepository class变得比较棘手,因为如果你在这个类上运行多个单元测试,它们将从测试到测试一起携带状态,这意味着测试运行变得依赖于顺序......这是非常不可取的


10
2018-06-09 01:44





对于简单的缓存我认为静态变量很好,只需要小心使用锁来保护访问_users变量的多个线程。但是,更好的方法可能是使用ASP.NET Cache类。我知道它在System.Web命名空间中,但你可以 也可以在ASP.NET应用程序之外使用它


3
2018-06-08 22:27





要考虑的事情。

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

这些可能会或可能不会对您的申请感兴趣。可能没有,但值得注意。


3
2018-06-08 22:35





如果您确实需要不止一个,那么您将不得不花费额外的精力从代码中删除静态代码并开始在整个地方传递它。


0
2018-06-08 22:42