2009-05-07 5 views
0

Je suis nouveau sur Flex et Cairngorm.Quand j'utilise ServiceLocator, je rencontre le problème: Erreur: C0001E: Une seule instance de ServiceLocator peut être instancié.Erreur Flex et Cairngorm: C0001E: Une seule instance de ServiceLocator peut être instanciée

Mon code est comme ceci:

En 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"/> 

En Delegate.as, j'ai des extraits:

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

En Main.xml , extraits comme:

<business:Service id="service" /> 

ce merveilleux petit message d'erreur apparaît la minute où je charge une seconde instance de certains modules qui nécessite httpservice.

Est-il possible de résoudre ce problème sans passer à un autre cadre?

Best Wishes,

Shuo de la Chine

Répondre

2

L'erreur que vous voyez est de la mise en œuvre de Cairngorm du motif Singleton. Cela vous empêche de créer une seconde instance de ServiceLocator, car le framework requiert qu'il y en ait un seul. Lors du chargement de la seconde instance de votre module, votre code essaye également de créer une seconde instance de ServiceLocator lorsqu'il devrait utiliser getInstance() (ou ne pas obtenir d'instance du tout). En déclarant votre balise Services dans Main.mxml, vous avez créé votre seule instance de ServiceLocator et vous ne pouvez la déclarer ou la remplacer nulle part ailleurs. Si Main.mxml fait partie du module que vous essayez d'instancier plus d'une fois, c'est là votre problème. Si non, je ne peux pas dire où dans votre code le problème est basé sur l'échantillon limité ci-dessus, mais il devrait être quelque part dans le module. En réponse au commentaire:

Aucun problème. Vous pouvez facilement résoudre votre problème en déclarant votre service dans ActionScript au lieu de MXML. En déclarant une balise en MXML, vous créez toujours une instance de la classe AS correspondante, alors que vous voulez récupérer l'instance solitaire du singleton. Pour ce faire, comprennent ce qui suit comme code à l'intérieur de votre module MXML:

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

qui est essentiellement équivalent de ce que vous essayez de faire avec la balise MXML, à l'exception de ne pas créer une nouvelle instance de service. Toutefois, vous devez toujours instancier le service quelque part. Pour ce faire, placez la balise Service MXML dans le fichier MXML principal de l'application qui charge les modules.

+0

Merci, Stiggler! Dans mon module, j'ai dans Main.mxml. Chaque fois que j'ouvre le module, j'instancie réellement un serviceLocator. Comme nous le savons, ServiceLocator valide une variable statique pour voir si une instance a déjà été créée dans son constructeur. Mais je pense que le constructeur ServiceLocator devrait être privé mais courant AS3 .0 ne le permet pas. Alors, est-il possible de résoudre ce problème? Comme le module est utilisé tout à fait. Merci beaucoup! Cordialement, Shuo – Shuo

+0

Merci encore, Stiggler! J'ai résolu mes problèmes en plaçant dans le MXML principal de l'application au lieu du module MXML. Vous êtes très utile! Bonne chance! Shuo de la Chine – Shuo

+0

Je suis heureux que je pourrais aider. Si vous pensez que cette question a reçu une réponse complète, s'il vous plaît allez-y et marquez la réponse comme acceptée. – Stiggler

Questions connexes