Ошибка Flex и Cairngorm: C0001E: может быть создан только один экземпляр ServiceLocator

Я новичок в Flex и Cairngorm. Когда я использую ServiceLocator, я сталкиваюсь с проблемой: Ошибка: C0001E: Может быть создан только один экземпляр ServiceLocator.

Мой код выглядит так:

В Serives.mxml:

<cairngorm:ServiceLocator xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:cairngorm="com.adobe.cairngorm.business.*">
<mx:HTTPService id="statistServ"
    url="rooms.xml"
    showBusyCursor="true"
    method="POST"
    resultFormat="array"/>

В Delegate.as у меня есть фрагменты:

this.service = ServiceLocator.getInstance().getHTTPService(”statistServ”);

В Main.xml фрагменты, такие как:

<business:Service id="service" />

это замечательное маленькое сообщение об ошибке появляется в тот момент, когда я загружаю второй экземпляр какого-то модуля, для которого требуется httpservice.

Есть ли способ решить эту проблему, не переходя на другую платформу?

С наилучшими пожеланиями,

Шуо из Китая

1 ответ

Решение

Ошибка, которую вы видите, связана с реализацией Cairngorm шаблона Singleton. Это мешает вам создать второй экземпляр ServiceLocator, потому что фреймворк требует, чтобы был только один. При загрузке второго экземпляра вашего модуля ваш код также пытается создать второй экземпляр ServiceLocator, когда он должен использовать getInstance() (или вообще не получать экземпляр).

Объявив тэг Services в Main.mxml, вы создали свой единственный экземпляр ServiceLocator, и он не может быть объявлен или обновлен где-либо еще. Если Main.mxml является частью модуля, который вы пытаетесь создать несколько раз, это ваша проблема. Если нет, я не могу сказать, где в вашем коде проблема основана на приведенном выше ограниченном примере, но она должна быть где-то в модуле.

В ответ на комментарий:

Нет проблем. Вы можете легко решить свою проблему, объявив свой Сервис в ActionScript вместо MXML. Объявляя тег в MXML, вы всегда создаете экземпляр соответствующего класса AS, тогда как вместо этого вы хотите извлечь единственный экземпляр синглтона. Для этого включите следующий код AS внутри модуля MXML:

var service:Service = Service(ServiceLocator.getInstance());

По сути, это эквивалентно тому, что вы пытаетесь сделать с тегом MXML, за исключением того, что не создается новый экземпляр службы.

Тем не менее, вам все еще нужно создать экземпляр Службы где-нибудь. Для этого поместите тег Service MXML внутри основного MXML приложения, которое загружает модули.

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