Come avere un controllo granulare di cache di secondo livello quando si utilizza il polimorfismo

StackOverflow https://stackoverflow.com/questions/8330006

Domanda

Ho ~ 40 classi, e tutti hanno implementare un'interfaccia IEntity.

Dei ~ 40 classi, molti usano un "many-to-One" mappatura a una proprietà IEntity. Un esempio di questo potrebbe essere:

"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;}  

}

Credo di usare NHibernate per mappare la proprietà Proprietario sul punto, ho bisogno di usare una delle mappature eredità di NHibernate utilizzando IEntity come base.

Il problema è che la configurazione della cache di 2 ° livello è legato a una definizione di classe, non alle sottoclassi. Avrei dovuto attivare la memorizzazione nella cache su tutti ~ 40 classi nel mio modello in una sola volta, e non sarei in grado di memorizzare nella cache solo le classi che voglio, come ad esempio le categorie.

Qualcuno sa come posso mappare un'entità che ha una proprietà che è il tipo di un'entità astratta, senza perdere la capacità di fare scelte di 2 ° livello di cache?

È stato utile?

Soluzione

In primo luogo, io non sono sicuro che in realtà l'idea di definire tipo proprieta come IEntity- Sei sicuro che va bene per Item di essere il proprietario di un altro articolo? Va bene per un Employee di essere il proprietario di un oggetto?
Se la risposta è sì, e questo è la logica di business del vostro sistema, allora non c'è niente da fare su questo.
Otherwise- può risultare utile per definire un IOwner o anche una classe base OwnerBase per fare questa distinzione.
Questo può anche essere utile con ditinguishing quali classi da memorizzare nella cache e che non a.

E ora alla questione di caching:

la definizione di cache di 2 ° livello deve avvenire in due luoghi:
1. La classe di mappatura
2. La mappatura associazione

nel tuo caso, credo che si dovrebbe effettivamente avere per accendere cache di 2 ° livello per tutte le classi IEntity. Ma se si attiva solo sul caching per specifica associazioni, quindi solo quelle associazioni sarebbero cache.
(Un'eccezione a questa sta usando Get<T>() o Load<T>() metodi, che sarebbe anche causare gli oggetti da memorizzare nella cache. Se non mi sbaglio, si può dire nHib non per utilizzare la cache per le query specifiche)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top