Comment mettre en œuvre correctement IUserType?
-
21-09-2019 - |
Question
Je dois créer un type personnalisé NHibernate en écrivant une nouvelle classe mappeur qui implémente IUserType
. Bien qu'il soit relativement facile de remplacer la plupart des méthodes et des propriétés, je reçois quelques difficultés à comprendre comment traiter correctement les membres suivants:
-
object Assemble(object cached, object owner);
-
object DeepCopy(object value);
-
object Disassemble(object value);
-
object Replace(object original, object target, object owner);
Je ne comprends pas ce qui est exactement leur but; et plus important encore, la façon de les mettre en œuvre correctement. La plupart des exemples que je l'ai vu juste retourner le paramètre d'entrée brut.
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
Comment mettre en œuvre ces méthodes correctement dans un cas réel ou d'un scénario plus complexe?
La solution
Regardez comment Ritesh Rao a fait dans son cadre de NCommon:
Le MoneyUserType met en œuvre une classe de base appelée CompositeUserTypeBase
Il y a plus de détails dans les commentaires, mais pour résumer:
- deepcopy - doit renvoyer une copie en profondeur de l'état persistant, arrêt à des entités et à des collections
- Disassemble - transforme l'objet en sa représentation « cacheable » (à savoir les associations doivent être mises en cache en tant que valeurs d'identificateur)
- Assemblez - reconstitue un objet de la représentation cacheable
Autres conseils
Vous pouvez consulter cette article . Il est un bon exemple de la façon d'implémenter l'interface IUserType.