Вопрос

Мне нужно создать пользовательский тип для 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top