在 .NET 中,为啥 ObjectCache 是 MemoryCache 的首选类型?

Posted

技术标签:

【中文标题】在 .NET 中,为啥 ObjectCache 是 MemoryCache 的首选类型?【英文标题】: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 那部分是有道理的。我的困惑是为什么在你的类型声明中使用抽象类而不是具体类。 我怀疑人们会这样做,因为这就是文档示例中的内容。 【参考方案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

【讨论】:

以上是关于在 .NET 中,为啥 ObjectCache 是 MemoryCache 的首选类型?的主要内容,如果未能解决你的问题,请参考以下文章

ObjectCache CachedObjectRemovedCallback 没有被调用?

为啥在 .NET 响应式扩展中不推荐主题?

为啥 .Net 字典中的条目要另外排序?

为啥 JSON.NET 以这种格式在我的 DataTable 中输出 DateTime 值?

为啥 log4net 线程卡在等待中?

诠释 x = 10; x += x--;在.Net - 为啥?