Come avere un controllo granulare di cache di secondo livello quando si utilizza il polimorfismo
-
26-10-2019 - |
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?
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)