Создание привязываемых классов из WSDL для Flex 3 - PullRequest
3 голосов
/ 13 июня 2009

Два наших приложения - это веб-приложения с интерфейсом Flex 3 и интерфейсом WCF в стиле SOAP. Для связи с серверной частью я создаю клиентские классы веб-служб с помощью Flex Builder 3. Все работает, но обслуживание этих сгенерированных классов было довольно раздражающим, и я ищу лучший способ сделать что-либо (без необходимости переписать, конечно). Вот проблемы:

  1. Я использую библиотеки Flex для управления компонентами, совместно используемыми приложениями. Некоторые из них зависят от сгенерированных классов, поэтому мне нужны сгенерированные WSDL классы в их собственной библиотеке. Однако Flex Builder 3 генерирует только классы для приложения Flex , поэтому мне нужно сгенерировать файлы в исходном дереве приложения, а затем каждый раз вручную перемещать файлы. Это также привносит странные побочные эффекты в то, как Eclipse управляет исходным кодом (почему он не может просто контролировать FS, как это делают другие IDE?).
  2. Мы используем привязку данных в MXML для декларативного связывания данных с пользовательским интерфейсом. Мне нравится привязка данных. К сожалению, классы в сгенерированном WSDL-коде не поддерживают привязку. Поэтому я решил создать программу для изменения классов ActionScript, добавив в них метаданные [Bindable]. Это должно выполняться каждый раз, когда мы обновляем код.
  3. Flex имеет очень неприятную ошибку, известную как минимум с марта, которая до сих пор не исправлена: http://bugs.adobe.com/jira/browse/SDK-19811. Я недавно обнаружил это, потому что это было двойное кодирование некоторых символов XML, таких как <и & в <и &. Поэтому мне также пришлось добавить обходной путь для этой программы манипулирования ActionScript. </li>
  4. Генератор WSDL-кода в Flex Builder создает String, Boolean, Int и другие классы , которые являются встроенными типами ! Мы всегда должны удалять эти исходные файлы, чтобы компилятор Flex иногда не работал.

Мне кажется маловероятным, чтобы все просто мирились с этими проблемами. Должен быть какой-то альтернативный способ создания прокси-классов веб-служб для Flex, который используют другие. Так как мне запрещено делать коммуникационный уровень RESTful и переписывать интерфейс в Silverlight, что вы предлагаете?

Ответы [ 2 ]

1 голос
/ 28 октября 2010

К сожалению, в генерации кода Flex 3 из WSDL отсутствует тег Bindable, и ручное решение этой проблемы - кошмар, особенно если у вас сложный сценарий с большим количеством типов.

Вы можете просто добавить тег вручную и удалить «generate.webservices» из всех объявлений переменных, чтобы код скомпилировался ... и тогда у вас возникнет другая проблема:

Что делать, если мне снова нужно сгенерировать код de? Либо я делаю все снова ... или у меня будет куча ошибок, обнаруженных только во время выполнения ...

Я использовал ANT для небольшой уловки:

Добавить Bindable для всех классов; Удалить полное пространство имен из всех объявлений переменных;

<target name="updateGeneratedCode" >
    <replace dir="PATH TO YOUR GENERATED CODE">
        <include name="**/*.as"/>
        <replacetoken>public class</replacetoken>
        <replacevalue><![CDATA[[Bindable]public class]]></replacevalue>   
    </replace>

    <replace dir="PATH TO YOUR GENERATED CODE" value=":">
        <include name="**/*.as"/>
        <replacetoken>:generated.webservices.</replacetoken>
    </replace>
</target>

Примечание: маркер замены ": generate.webservices." может отличаться в вашем случае, поэтому вы можете заменить его на сгенерированное пространство имен.

Пока это работает для меня.

Надеюсь, это кому-нибудь поможет!

Антонио Инасио

1 голос
/ 16 июня 2009

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

  1. Вы можете использовать один из двух классов ServiceDescription для чтения в WSDL и проверки его содержимого с точки зрения объектной модели;
  2. Вы можете использовать шаблоны T4 в Visual Studio с небольшим количеством настраиваемой работы для представления WSDL-шаблона (возможно, через класс ServiceDescription, как указано выше)
  3. Вы можете использовать XSLT для преобразования WSDL в код, который вам нужен
  4. Вы можете написать отдельную программу для чтения WSDL (в виде XML или объектной модели) и просто выдавать текст, который вы хотите для своего прокси-кода.

Суть в том, что если у вас проблемы с инструментами автоматизации, то есть практические способы создания своих.

...