Какие проблемы связаны с отправкой Hibernate Proxy клиентам? - PullRequest
2 голосов
/ 22 октября 2009

У меня есть классы POCO, которые я использую с NHibernate на уровне службы WCF. И я думаю о попытке отправить прокси-классы NHibernate клиенту. Это клиент, который я контролирую. Мы обрабатываем обновления записей с резервированием в масштабе всей системы, поэтому в любой момент времени клиенту может быть отправлена ​​только одна копия этой сущности. Моя основная цель - использовать отслеживание изменений NHibernates, поэтому мне не нужно извлекать копию из базы данных и воспроизводить изменения, внесенные клиентом для обновления базы данных.

Предполагая, что я смогу заставить это работать, каковы минусы этого подхода?

Ответы [ 2 ]

4 голосов
/ 22 октября 2009

Я не собираюсь отвечать на вопрос с точки зрения конкретной технологии, но я надеюсь, что вы найдете эту точку зрения полезной при принятии некоторых решений.

ИМХО (и тем из людей, которые следуют Домен-управляемый дизайн ), вы должны держать свои типы сущностей внутренними и, таким образом, отделенными от типов ваших услуг (или типов значений). Очень часто сущности слишком гранулированы для интерфейса службы в любом случае. Например, вы можете захотеть вернуть результат операции на уровне сервиса, который на самом деле является комбинацией разрозненных фрагментов данных в вашей модели сущности. Мало того, но не все поля сущности обязательно предназначены для непосредственного изменения клиентом. Кроме того, если вы начнете выставлять свои типы полномочий напрямую, вы рискуете вступить в брак с базовыми структурами базы данных, которые со временем могут потребовать рефакторинга из соображений масштабируемости. Отделяя типы значений вашего сервиса от базовых сущностей, которые их заполняют, вы даете себе важный уровень гибкости.

Недостатком является то, что вы пишете много типов значений, которые по сути являются "пустыми оболочками" внутри домена службы, которые обычно очень похожи на типы сущностей в вашем слое доступа к данным. Кроме того, вам нужны функции отображения для перевода значений назад и вперед между двумя типами. Для меня это небольшая цена за гибкость, которая предоставляется в будущем.

2 голосов
/ 22 октября 2009

Ленивая загрузка даст вам самую большую головную боль.

Некоторые свойства ваших объектов будут содержать прокси NHibernate, которые прикреплены к ISession. Все это вернется к клиенту. Когда клиент пытается десериализовать ваши объекты, прокси-серверы запускаются и пытаются получить больше данных. БУМ!

Люди опубликовали несколько обходных путей (Google " nhibernate wcf " или " nhibernate wcf lazy loading "):

http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/

http://timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspx

http://whiletrue.nl/blog/?p=37

http://trentacular.com/2009/08/how-to-use-nhibernate-lazy-initializing-proxies-with-web-services-or-wcf/

В настоящее время я работаю над заменой прокси на пользовательские, поэтому они выполняют вызов WCF вместо запуска отложенной загрузки Nhibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...