Подтвердить что ты не робот

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

Как правильно реализовать эти методы в реальном случае или более сложном сценарии?

4b9b3361

Ответ 1

Посмотрите, как Ритеш Рао сделал это в своей NCommon framework:

MoneyUserType реализует базовый класс CompositeUserTypeBase

В комментариях более подробно, но вкратце:

  • DeepCopy - должен возвращать глубокую копию постоянного состояния, останавливаясь на объектах и ​​в коллекциях
  • Disassemble - преобразует объект в его "кэшируемое" представление (т.е. ассоциации должны кэшироваться как значения идентификатора)
  • Собрать - реконструирует объект из кэшируемого представления

Он более подробно объяснил здесь

Ответ 2

Вы можете проверить эту статью . Это хороший пример того, как реализовать интерфейс IUserType.