Как получить гранулярный контроль кеша 2-го уровня при использовании полиморфизма - PullRequest
0 голосов
/ 30 ноября 2011

У меня ~ 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;}  

}

Полагаю, что для отображения свойства Owner на Item мне нужно использовать NHibernate, мне нужно будет использовать одно из отображений наследования NHibernate, используя IEntity в качестве основы.

Проблема в том, что конфигурация кэша 2-го уровня связана с определением класса, а не с подклассами. Мне нужно было бы включить кэширование для всех ~ 40 классов в моей модели за один раз, и я бы не смог просто кэшировать нужные мне классы, например категории.

Кто-нибудь знает, как я могу отобразить сущность, у которой есть свойство, которое является типом абстрактной сущности, не теряя способности делать выбор в кэш 2-го уровня?

1 Ответ

1 голос
/ 01 декабря 2011

во-первых, я не уверен, что действительно понял идею определения типа свойств как IEntity - вы уверены, что Item может быть владельцем другого объекта? Employee нормально ли быть владельцем предмета?
Если ответ «да», и это бизнес-логика вашей системы, то тут ничего не поделаешь.
В противном случае вам может быть полезно определить IOwner или даже OwnerBase базовый класс, чтобы помочь с этим различием.
Это также может быть полезно для определения, какие классы кэшировать, а какие нет.

А теперь к вопросу о кешировании:

определение кэша 2-го уровня должно происходить в двух местах:
1. Отображение класса
2. Отображение ассоциации

в вашем случае, я полагаю, вам действительно нужно было бы включить кэш 2-го уровня для всех классов IEntity. Но если вы включите кэширование только для определенных ассоциаций, то будут кэшироваться только эти ассоциации.
(Исключением является использование методов Get<T>() или Load<T>(), которые также могут привести к кешированию ваших объектов. Если я не ошибаюсь, вы можете указать nHib , а не , использовать кеш для определенных целей. запросы)

...