Результаты веб-службы 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.

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

9.08.2008 07:34:01
3 ОТВЕТА
РЕШЕНИЕ

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

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

5
9.08.2008 08:58:24

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

3
11.08.2008 18:07:11

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

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

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

1
27.12.2008 18:35:48