Результаты веб-службы ASP.NET, классы прокси и преобразование типов

Я все еще новичок в мире ASP.NET, так что я мог бы быть далеко от базы здесь, но пока это в меру моих (ограниченных) знаний!

Допустим, у меня есть стандартный бизнес-объект "Контакт" в пространстве имен Business. Я пишу веб-сервис, чтобы получить информацию о контакте из базы данных и вернуть ее. Затем я пишу клиентское приложение для запроса указанных деталей.

Теперь я также создаю служебный метод, который принимает "контакт" и делает с ним магию, например Utils.BuyContactNewHat() сказать. Который, конечно, принимает контакт типа Business.Contact,

Затем я возвращаюсь к своему клиентскому приложению и хочу использовать BuyContactNewHat метод, поэтому я добавляю ссылку на мое пространство имен Utils, и это так. Однако проблема возникает с:

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

С возвращаемым типом GetContact имеет MyWebService.Contact и не Business.Contact как и ожидалось. Я понимаю, почему это происходит, потому что при доступе к веб-сервису вы фактически программируете с использованием прокси-класса, сгенерированного WSDL.

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

3 ответа

Решение

Ты на правильном пути. Чтобы получить данные из прокси-объекта обратно в один из ваших собственных объектов, вы должны сделать код левой и правой руки. т.е. копировать значения свойств. Держу пари, что уже существует универсальный метод, который использует рефлексию.

Некоторые люди будут использовать что-то кроме веб-службы (.net remoting), если они просто хотят получить бизнес-объект по проводам. Или они будут использовать двоичную сериализацию. Я предполагаю, что вы используете веб-сервис по какой-то причине, поэтому вам придется копировать свойства.

На самом деле вам не нужно использовать сгенерированный класс, который вам дает WSDL. Если вы посмотрите на код, который он генерирует, он просто вызывает некоторые классы платформы.NET для отправки запросов SOAP. В прошлом я копировал этот код в обычный файл.cs и редактировал его. Хотя я специально не пробовал это сделать, я не вижу причин, по которым вы не можете отбросить определение прокси-класса и использовать исходный класс для получения результатов вызова SOAP. Должно быть, это уже делает отражение под капотом, кажется, стыдно делать это дважды.

Я бы порекомендовал вам взглянуть на написание расширения Schema Importer, которое вы можете использовать для управления генерацией прокси-кода. Этот подход можно использовать для (изящного) решения вашей проблемы без ошибок (например, копирование объектов из одного пространства имен в другое или изменение сгенерированного прокси-объекта reference.cs только для замены его при следующем обновлении веб-ссылки).

Вот (очень) хороший учебник по этому вопросу:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

Другие вопросы по тегам