Отправка классов модели ORM через транспорты http / tcp - PullRequest
1 голос
/ 26 февраля 2011

Это общий вопрос о том, как вы справляетесь с моделями ORM, когда им приходится передавать их между приложениями через транспорты http и tcp, однако, в частности, я использую NHibernate через Castle Active Record, если это имеет какое-либо значение.Формат данных для транспорта может быть JSON или XML.

При передаче моделей ORM через транспорты возникают три проблемы:

  1. Ошибки циклической ссылки при сериализации XML / JSON.Эти ошибки можно устранить с помощью атрибутов ScriptIgnore и XmlIgnore в свойствах отношений, однако это не очень удачное решение, поскольку иногда вы хотите включить связанные объекты, которые игнорируются, и вы можете вызвать циклические ошибки ref в другом месте, если удалите атрибуты ignore.

  2. Ленивая загрузка при сериализации.Допустим, у вас есть класс A, который имеет отношение 1: 1 к классу B. Вы сериализуете класс A, и он будет пытаться вызвать db для получения и сериализации класса B. Иногда вы больше не находитесь в надлежащем сеансе, который допускает отложенную загрузку.в точке сериализации, и это выдает ошибки.Эту проблему также можно решить с помощью атрибутов ignore, но по той же причине это не является хорошим решением.

  3. Базовые классы моделей ORM не сериализуются в XML, а запечатаны.Я не знаю ни одного решения для этого, но я сталкивался с ним много раз.

Одно из решений вышеуказанных проблем - не передавать модели ORM назад и вперед черезтранспорты вообще, и я слышал, многие говорят, что это рекомендуемое решение.Тем не менее, как вы тогда делаете это в чистом виде?Допустим, у вас есть ModelA, которую вы хотите передать из одного приложения в другое, используя какой-то вид транспорта.

  1. Вы создаете класс ModelAView, который имеет все свойства ModelA, за исключением всех атрибутов ORM, базовых классов и функций отложенной загрузки.Решение уже не является чистым, так как теперь у вас есть 2 класса с одинаковыми дублированными свойствами.Если вы хотите внести изменение в модель, вам придется изменить его в обоих классах.

  2. Вы извлекаете экземпляр ModelA из базы данных и должны заполнять поле за полемсвойства модели AView.Возможно, у вас есть конструктор для ModelAView, который передает экземпляр ModelA и устанавливает там свойства, так что это немного чище.Однако вам все равно придется устанавливать свойство values ​​по свойству, что может быть громоздким.Вы можете попытаться выполнить какую-то функцию клонирования, однако, если у нее есть дочерние объекты, вам нужно углубиться в клонирование, и не похоже, что есть хороший способ сделать это, тем более что класс View не обязательно будет иметь всес теми же свойствами, что и класс ModelA.

  3. Передача ModelAView через транспорт другому приложению.

  4. Надеемся, что другое приложение сможетпросто используйте ModelAView для всего, что нужно сделать.Однако если ему необходимо обновить свойства ModelA и сохранить их в БД, то потребуется выполнить обратное, скопировать все свойства из ModelAView в ModelA и затем сохранить в БД.

Итак, я много здесь написал, но надеюсь, я ясно дал понять, какие проблемы у меня возникают при работе с моделями ORM в этих ситуациях.Есть ли у кого-нибудь опыт, которым они могут поделиться с помощью проверенных и настоящих методов для решения этих проблем, которые не требуют дублирования кода и / или копирования свойств за свойством значений из одного объекта в другой?

1 Ответ

4 голосов
/ 26 февраля 2011

Я думаю, тебе не повезло.Я столкнулся с той же проблемой (многие люди имеют), и, похоже, все согласны с тем, что вы должны использовать DTO (Data Transfer Objects). AutoMapper делает это немного проще.

Вы можете избавить себя от необходимости конвертировать сущности в DTO, если вы используете преобразователи результатов NH для возврата ваших результатов в качестве DTO.

В итоге мы создали пару разных DTO для каждой сущности, каждая из которых содержит разные дочерние элементы или коллекции, например, Customer, CustomerWithOrders и т. Д. Клиент, которому нужен DTO, должен заранее знать, что ему нужно, чтобы он могзапросите правильный вид.

Поддерживать его не так уж и плохо, поскольку наши сущности не сильно меняются.

...