Как правильно реализовать IUserType?
Мне нужно создать настраиваемый тип для NHibernate путем написания нового класса сопоставления, который реализует IUserType
. Хотя относительно просто переопределить большинство методов и свойств, мне трудно понять, как правильно обращаться со следующими членами:
-
object Assemble(object cached, object owner);
-
object DeepCopy(object value);
-
object Disassemble(object value);
-
object Replace(object original, object target, object owner);
Я не понимаю, что именно их цель; и что более важно, как правильно их реализовать. Большинство примеров, которые я видел, просто возвращают исходный входной параметр.
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;
}
Как правильно реализовать эти методы в реальном случае или более сложном сценарии?
Ответы
Ответ 1
Посмотрите, как Ритеш Рао сделал это в своей NCommon framework:
MoneyUserType реализует базовый класс CompositeUserTypeBase
В комментариях более подробно, но вкратце:
- DeepCopy - должен возвращать глубокую копию постоянного состояния, останавливаясь на объектах и в коллекциях
- Disassemble - преобразует объект в его "кэшируемое" представление (т.е. ассоциации должны кэшироваться как значения идентификатора)
- Собрать - реконструирует объект из кэшируемого представления
Он более подробно объяснил здесь
Ответ 2
Вы можете проверить эту статью . Это хороший пример того, как реализовать интерфейс IUserType.