如何在使用多态性时对二级缓存进行粒度控制



我有大约40个类,它们都实现了一个接口IEntity。

在大约40个类中,许多类使用"多对一"映射到一个IEntity属性。例如:
"IEntity.cs"
public interface IEntity
{
   Guid ID
   ...Other properties (~7 of them)
}
"Item.cs"
public class Item : IEntity
{
   Public Guid ID {get;set;}
   ...Other IEntity Properties
   Public IEntity Owner {get;set;}  
}

我相信使用NHibernate映射Owner属性到Item,我将需要使用一个NHibernate的继承映射使用IEntity作为基础。

问题是第二级缓存的配置与类定义绑定,而不是与子类绑定。我必须一次打开模型中所有40个类的缓存,而且我不能只缓存我想要的类,比如类别。

有没有人知道我如何映射一个实体,有一个属性,是一个抽象实体的类型,而不会失去能力,使第二级缓存选择?

首先,我不确定我是否真的得到了将属性类型定义为IEntity的想法-您确定Item是另一个项目的所有者吗?一个Employee是一个项目的所有者是可以的吗?
如果答案是肯定的,并且这是您系统的业务逻辑,那么就没有什么可做的了。
否则,您可能会发现定义IOwner甚至OwnerBase基类来帮助区分这种区别是有帮助的。
这也有助于区分哪些类需要缓存,哪些不需要缓存。

现在是关于缓存的问题:

第二级缓存的定义需要出现在两个地方:
1. 类的映射
2. 关联映射

在您的情况下,我相信您确实必须打开所有IEntity类的第二级缓存。但是如果您只为特定的关联打开缓存,那么只有这些关联将被缓存。(一个例外是使用Get<T>()Load<T>()方法,这也会导致对象被缓存。如果我没弄错的话,你可以告诉nHib not对特定查询使用缓存)

最新更新