Как правильно реализовать 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.

Другие вопросы по тегам