2009-05-07 2 views
0

Я новичок в Flex и Cairngorm.While Я использую ServiceLocator, я столкнулся с проблемой: Ошибка: C0001E: может быть только один экземпляр ServiceLocator инстанцирован.Ошибка Flex и Cairngorm: 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.

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

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

Шо из Китая

ответ

2

Ошибка вы видите это от реализации Кэрнгормс в шаблон 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 приложения, которое загружает модули.

+0

Спасибо, Стиглер! Вы правы! В моем модуле у меня есть в Main.mxml. Каждый раз, когда я открываю модуль, я фактически создаю экземпляр serviceLocator. Как известно, ServiceLocator проверяет статическую переменную, чтобы увидеть, был ли экземпляр уже создан в его конструкторе. Но я думаю, что конструктор ServiceLocator должен быть закрытым, но существующим AS3 .0 не позволяет. Итак, есть ли способ решить это? Поскольку модуль используется довольно часто. Большое спасибо! С уважением, Shuo – Shuo

+0

Еще раз спасибо, Стиглер! Я решил свои проблемы, разместив внутри основного MXML приложения, а не модуля MXML. Вы очень поможете! Удачи! Shuo из Китая – Shuo

+0

Я рад, что смогу помочь. Если вы почувствуете, что этот вопрос был полностью отвечен, пожалуйста, продолжайте и отметьте ответ как принятый. – Stiggler

 Смежные вопросы

  • Нет связанных вопросов^_^