Создание привязываемых классов из WSDL для Flex 3

Два наших приложения - это веб-приложения с интерфейсом 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.
  4. Генератор кода WSDL в Flex Builder создает классы String, Boolean, Int и другие, которые являются встроенными типами! Нам всегда приходится удалять эти исходные файлы, чтобы компилятор Flex не прерывал работу.

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


person Jacob    schedule 13.06.2009    source источник


Ответы (2)


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

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

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

person John Saunders    schedule 16.06.2009

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

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

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

Я использовал 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>

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

У меня пока работает.

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

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

person António Inácio    schedule 27.10.2010
comment
‹Target name = updateGeneratedCode› ‹replace dir = ПУТЬ К СОЗДАННОМУ КОДУ› ‹include name = * / .as /› ‹replacetoken› публичный класс ‹/replacetoken› ‹replacevalue› ‹! [CDATA [CDATA [CDATA [ [Bindable] public class]] ›‹/replacevalue› ‹/replace›‹ replace dir = ПУТЬ К ВАШЕМУ СОЗДАННОМУ КОДУ value =: ›‹ include name = * / .as / ›‹replacetoken›: created.webservices. ‹/replacetoken› ‹/replace› ‹/target› - person António Inácio; 28.10.2010
comment
Отступайте в коде с 4 пробелами, чтобы он отображался как код в SO (исправлено) - person Jacob; 28.10.2010