使用单例进行缓存

时间:2011-08-28 07:20:20

标签: c# caching singleton

我最近读到单身是一种反模式,除非确实需要,否则不应该使用 在我们的所有项目中,我们使用单例模式来保存一些缓存数据,例如:

class SomeClass
{
   public SomeClass()
   {
       var somedata = Singleton.Instance.GetSomeData(stringRepresintation); // or like that
       var someData = Singleton.Instance.SomeData;
   }      
}

保存该数据的建议设计是什么(静态类或其他内容)?

2 个答案:

答案 0 :(得分:5)

好吧,您可以将缓存视为依赖项 - 并将实例(可能是同一个实例)传递到需要它的所有内容中。在我已经使用依赖注入的情况下,这就是我要做的事情。

这样可以更轻松地测试那些需要缓存的类 - 您可以为每个测试创建一个新的缓存,而不必担心清除现有的缓存。您还可以并行化测试,而不必担心两个测试会混淆彼此的缓存。此外,它使缓存依赖性更加清晰。

(无论你是否使用界面来表示缓存,因为cdhowie建议由你决定。你没有拥有,尽管如果你做的话,它会更多地将类与其依赖关系分离如果您的缓存非常简单并且您不介意在测试中使用生产实现,那么可能不值得提取接口。)

答案 1 :(得分:2)

您将创建一些ICache接口,用于定义缓存提供程序所需的成员。然后,您将允许将实例传递到SomeClass()。如果调用者未指定默认实例,您仍然可以使用默认实例(实现ICache)。这是依赖注入模式,它基本上与单例模式完全相反。

这将允许替换不同的缓存机制(或只是不同的缓存实例)而不对SomeClass进行任何更改。