La globalizzazione con NHibernate
-
16-09-2019 - |
Domanda
Come si costruire gli oggetti del dominio e creare i rispettivi file di mapping NHibernate per un'applicazione multi lingua. La parte dell'interfaccia utente è memorizzato nel file di risorse, ma i dati utente ha bisogno di andare in banca dati.
Voglio fare quanto segue:
Product p = DALProduct.getByID(2)
p.name //results in the language of the current UICulture
Ho trovato il seguente articolo, che è davvero vicino: http://ayende.com/Blog/archive/2006/12/ 26 / LocalizingNHibernateContextualParameters.aspx Come io sono nuovo di NHibernate non sono sicuro se questo sarà perfettamente lavorare per soluzioni aziendali.
Avete altri suggerimenti? Come si risolve tale scenario?
Dovrebbe essere flessibile a:
- Inserimento, Aggiornamento e selezionando
- Collezioni
Soluzione
Ayendes post è un grande inizio come dovrebbe essere progettato.
Sarà perfettamente lavorare per soluzioni aziendali. I nomi in una tabella separata è come qualsiasi altro elenco di valori. La cosa speciale è che è filtrata nella mappatura.
Modifica - Opzioni:
Usa un altro soggetto per modificare i dati
Non c'è un'entità prodotto che ha tutti i nomi come lista. LocalizedProduct ha solo il nome attuale lingue.
Prendi l'entità filtrato
- da una mappatura come descritto nel blog, con il filtro.
- selezionandolo con un trasformatore di risultato (Transformers.AliasToBean) oppure con 'selezionare nuove LocalizedProduct (id, nome, premio ...)'. LocalizedProduct non verrebbe mappato in questo caso. Dovrebbe essere di secondo livello-cache-friendly.
Se si dispone di molti riferimenti al prodotto, ma probabilmente non è così bello avere due classi, perché non si sa quale classe il riferimento dovrebbe avere.
Utilizzare la stessa entità per l'editing e la visualizzazione
class Product
{
string LocalizedName
{
get { return AllProductNames[Thread.CurrentThread.CurrentCulture.LCID]; }
}
IDictionary<int, string> AllProductNames { get; private set; }
}
Ci sono le proprietà per il nome del prodotto localizzato (ottenere) e tutti i nomi dei prodotti.
- Non filtrare affatto :-) C'è un po 'di sovraccarico della rete. se hai solo da 3 a 5 lingue, non è poi così male. se si dispone di 20 o più, è probabilmente meglio per filtrare i nomi.
- utilizzare un filtro (opzionale), come descritto nel blog, ma sui nomi dei prodotti
- utilizzare una (opzionale) ResultTransformer (CriteriaUtil.AliasToEntityMap) per filtrare i nomi.
Per essere onesti, io sceglierei un opzione che non muore bisogno di filtri nei file di mapping. Filtri appartengono alle domande in cui sono più gestibile.