использование ленивых прокси Nhibernate с веб-сервисом - PullRequest
0 голосов
/ 30 июля 2011

Недавно у меня были некоторые проблемы с производительностью в веб-сервисе SOAP, который я написал некоторое время назад.Я заметил, что у меня было много запросов и мои отображения hbm.xml были полны ленивых = ложных утверждений.Я обновил до NHibernate 3.0 и удалил ленивый = ложный материал, и все стало намного быстрее .... но теперь я получаю следующую ошибку:

System.InvalidOperationException: произошла ошибка, генерирующаяXML документ---> System.InvalidOperationException: тип UserProxy не ожидался.Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.

Пользователь - это класс, для которого я удалил свойство lazy = false из тега класса следующим образом:

<class name="User" table="Users" >
  <id name="DatabaseID" unsaved-value="0" column="ID" type="integer" >
    <generator class="native"/>
   </id>
   <property name="IsExpert"/>
    .....more stuff here....
</class>

В моем веб-сервисе есть такой метод (немного упрощенный ... в реальной жизни я использую шаблон, похожий на репозиторий, между сервисом и nhibernate):

    [WebMethod]
    public User GetUser(int userid)
    {
        session = GetCurrentSession();
        return session.Load<User>(userid);                         
    }

Веб-сервис ожидает сериализации пользователяи NHibernate дает мне UserProxy (который не совсем пользователь).Как мне это преодолеть?

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Не возвращать сущности из веб-метода.Используйте DTO.

0 голосов
/ 31 июля 2011

Веб-сервисы не могут сериализовать прокси - session.Load (userId) вернет прокси.Вы должны использовать session.Get (userId).

Я думаю, что ответы о том, что вы должны использовать DTO, бесполезны, есть время и место для DTO, и иногда вы можете просто захотеть вернуть объект.

Если у пользователя есть дочерние прокси-свойства, у меня есть класс для обработки этой ситуации.По сути, он просматривает все свойства (используя отражение и рекурсивно просматривая дочерние объекты и коллекции) и использует NHibernate.IsInitialized, чтобы проверить, является ли свойство прокси или подлинной статьей.Если это прокси-сервер, он устанавливает его в null, что позволяет WCF сериализовать его.

...