Как правильно реализовать IUserType?
-
21-09-2019 - |
Вопрос
Мне нужно создать пользовательский тип для NHibernate ( ГИбернация ) написав новый класс mapper , который реализует 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;
}
Как правильно реализовать эти методы в реальном случае или по более сложному сценарию?
Решение
Взгляните на то, как Ритеш Рао сделал это в своей Обычное дело фреймворк:
В MoneyUserType Денежный пользовательтип реализует базовый класс, называемый База CompositeUserTypeBase
В комментариях есть более подробная информация, но подведем итог:
- DeepCopy - должен возвращать глубокую копию постоянного состояния, останавливаясь на объектах и коллекциях
- Дизассемблировать - преобразует объект в его "кэшируемое" представление (т.е.ассоциации должны быть кэшированы как значения идентификаторов)
- Assembly - восстанавливает объект из кэшируемого представления.
Другие советы
Возможно, вы захотите проверить это Статья.Это хороший пример того, как реализовать интерфейс IUserType.