在 .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
类型的参数,而不是FileStream
或MemoryStream
:无需关心您拥有哪种实现的灵活性。
ObjectCache
是MemoryCache
的基类。在实例化时,您正在创建一个特定的实现,但在代码的其他地方,您拥有哪个实现并不重要。重要的是基类提供的通用接口。您可以更改实例化以创建不同的类型,并且不必修改使用缓存的代码。
【讨论】:
【参考方案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 没有被调用?