【问题标题】:In .NET, why is ObjectCache the preferred type over MemoryCache?在 .NET 中,为什么 ObjectCache 是 MemoryCache 的首选类型?
【发布时间】:2019-08-13 17:27:51
【问题描述】:

Somanyexamples 在.NET (including the official docs) 中使用内存缓存实例化它:

private readonly ObjectCache memoryCache = MemoryCache.Default;

有什么理由更喜欢这个:

private readonly MemoryCache memoryCache = MemoryCache.Default;

【问题讨论】:

  • 正如docs 所说,“MemoryCache 类是抽象 ObjectCache 类的具体实现。”
  • @stuartd 那部分是有道理的。我的困惑是为什么在你的类型声明中使用抽象类而不是具体类。
  • 我怀疑人们会这样做,因为这就是文档示例中的内容。

标签: c# .net memorycache objectcache


【解决方案1】:

这类似于声明变量或接收Stream 类型的参数,而不是FileStreamMemoryStream:无需关心您拥有哪种实现的灵活性。

ObjectCacheMemoryCache 的基类。在实例化时,您正在创建一个特定的实现,但在代码的其他地方,您拥有哪个实现并不重要。重要的是基类提供的通用接口。您可以更改实例化以创建不同的类型,并且不必修改使用缓存的代码。

【讨论】:

    【解决方案2】:

    比起MemoryCache,更喜欢ObjectCache 的原因是SOLID 中的L...

    里氏替换原则:

    程序中的对象应该可以替换为它们的实例 子类型而不改变该程序的正确性。

    ObjectCache 可以被它的任何子类型(包括MemoryCache)替换,而MemoryCache 不能被任何强迫你进入特定实现的东西替换。

    【讨论】:

    • 好点。但是,按照相同的逻辑,所有属性都应该是“object”类型而不是“string”或“int”吗?
    • 不,因为这些是基本数据类型,所有(字符串除外)都是值类型,而不是引用类型,强类型是框架的主要特征之一......跨度>
    • @DeanKuga,这与依赖注入的关系比 Liskov 的更密切。您希望与提供最多功能且限制最少的对象耦合。
    【解决方案3】:

    ObjectCache 是一个抽象类,因此您不能直接实例化它,并演示如何构建一个符合 ObjectCache 编写者希望您遵守的规则的缓存。

    这样 MemoryCache 继承自 ObjectCache。对于日常使用,您将使用 MemoryCash。但如果你想拥有自己的,你可以从 objectCash 继承并编写你自己的方法。

    public class MemoryCache : ObjectCache, 
    IEnumerable, IDisposable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2010-09-13
      • 2011-01-27
      相关资源
      最近更新 更多