Question

Flex et Cairngorm sont nouveaux pour moi. Même si j'utilise ServiceLocator, je rencontre le problème suivant: Erreur: C0001E: une seule instance ServiceLocator peut être instanciée.

Mon code est comme ceci:

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

Dans Delegate.as, j'ai des extraits:

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

Dans Main.xml, des extraits tels que:

<business:Service id="service" />

Ce merveilleux petit message d'erreur apparaît à la minute où je charge une deuxième instance d'un module nécessitant httpservice.

Existe-t-il un moyen de résoudre ce problème sans passer à un autre framework?

Meilleurs voeux,

Shuo de Chine

Était-ce utile?

La solution

L'erreur que vous voyez provient de l'implémentation du motif Singleton par Cairngorm. Cela vous empêche de créer une deuxième instance de ServiceLocator, car la structure exige qu'il n'y en ait qu'une. Lors du chargement de la deuxième instance de votre module, votre code tente également de créer une deuxième instance de ServiceLocator alors qu'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 il ne peut être ni déclaré ni créé ailleurs. Si Main.mxml fait partie du module que vous essayez d’instancier plusieurs fois, c’est votre problème. Sinon, je ne saurais dire où, dans votre code, le problème est basé sur l'échantillon limité ci-dessus, mais il devrait figurer quelque part dans le module.

En réponse au commentaire:

Pas de 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 souhaitez plutôt récupérer l'instance unique du singleton. Pour ce faire, insérez le code AS suivant dans votre module MXML:

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

Cela équivaut essentiellement à ce que vous essayez de faire avec la balise MXML, à l'exception de la non-création d'une nouvelle instance de service.

Cependant, vous devez toujours instancier le service quelque part. Pour ce faire, placez la balise Service MXML à l'intérieur du MXML principal de l'application qui charge les modules.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top