Как правильно реализовать IUserType?
Мне нужно создать собственный тип для 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;
}
Как правильно реализовать эти методы в реальном случае или в более сложном сценарии?
2 ответа
Посмотрите, как Ritesh Rao сделал это в своей структуре NCommon:
MoneyUserType реализует базовый класс CompositeUserTypeBase
Там больше деталей в комментариях, но суммировать:
- DeepCopy - должен возвращать глубокую копию постоянного состояния, останавливаясь на объектах и в коллекциях
- Дизассемблирует - преобразует объект в его "кэшируемое" представление (т.е. ассоциации должны кэшироваться как значения идентификатора)
- Assemble - восстанавливает объект из кэшируемого представления.
Вы можете проверить эту статью. Это хороший пример того, как реализовать интерфейс IUserType.