Sviluppando applicazioni con NHibernate capita spesso di avere l’esingenza di creare uno UserType per mappare in modo particolare una classe. In questo post non mi interessa descrivere come realizzare uno UserType , basta fare una ricerca su google per “essere sommersi” di guide, quello che voglio mostrare è la semplicità di mapping di uno UserType tramite FluentNHibernate e la classe generica UserTypeConvention<TUserType>. Supponiamo di avere le classi Money e MoneyUserType, rispettivamente la classe da persistere e la definizione dello UserType, il mapping consiste semplicemente in qusto snippet di codice.
1: public class MoneyUserTypeConvention : UserTypeConvention<MoneyUserType>
2: {
3: }
Il passo successivo è configuare opportunamente FluentNHibernate. La curiosità però mi ha spinto ad indagare tramite Reflector cosa fa questa classe.
Dall’immagine è chiaro che FluentNHibernate nel metodo Accept, utilizzato per capire se applicare quella determinata convenzione, crea una istanza di TUserType. Se abbiamo un numero elevato di UserType avremo anche un numero elevato di chiamate al metedo CreateInstance con conseguenti problemi di performance nella fase di creazione del mapping. Per ovviare a questo “problema” basta effettuare l’override del metodo e specificare esplicitamente il criterio di uguaglianza.
1: public class MoneyUserTypeConvention : UserTypeConvention<MoneyUserType>
2: {
3: public override bool Accept(System.Type type)
4: {
5: return type == typeof (Money);
6: }
7: }