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

Я все еще новичок в мире 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 ]

4 голосов
/ 09 августа 2008

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

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

3 голосов
/ 11 августа 2008

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

1 голос
/ 27 декабря 2008

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

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

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

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