- Statistiques
- Stats Relax
- Stats Poker/Aracde
des fichiers XML externes mai être une alternative adéquate aux MXML si:
• Vos changements de configuration souvent et vous souhaitez éviter l'étape de compilation supplémentaire.
• La configuration doit être édité par des personnes sans connaissances en programmation.
• Vous n'êtes pas en utilisant Flex . Bien sûr, vous mai également choisi d'externaliser seulement des parties de votre configuration dans les fichiers XML et coller avec MXML pour le câblage de vos services de base. Voir des mécanismes de configuration 3.6 Combinaison de plusieurs pour plus de détails.
http://www.spicefactory.org/parsley/doc ... hp#combine
Utilisant les classes deux mêmes exemple comme indiqué dans la section ci-dessus MXML, c'est ainsi que le fichier de configuration XML ressemblerait à ceci:
Code : Tout sélectionner
<objects
xmlns="http://www.spicefactory.org/parsley"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.spicefactory.org/parsley
http://www.spicefactory.org/parsley/schema/2.0/parsley-core.xsd"
>
<object type="com.bookstore.services.LoginServiceImpl">
<property name="timeout" value="3000"/>
</object>
<object type="com.bookstore.services.LoginServiceImpl"/>
</objects>
Dans la configuration générale XML ressemble beaucoup comme la configuration MXML avec des balises de persil MXML. Sous le capot balises XML et les balises MXML carte pour les classes même cadre. La principale différence est que l'on suit les conventions de nommage XML, afin que les balises ne sont pas capitalisées et noms d'attribut utiliser des tirets et non pas de cas de chameau (cible EG-propriété au lieu de targetProperty).
Initialisation est juste une seule ligne, en supposant que vous avez enregistré le fichier en tant que config . xml:
Code : Tout sélectionner
XmlContextBuilder.build("config.xml");
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:XmlConfig file="config.xml"/>
</parsley:ContextBuilder>
Une chose que vous devez prendre en compte est que, contrairement à la configuration MXML les classes que vous utilisez dans le fichier de configuration ne sera pas compilé dans votre CFC ou SWF si vous ne les utilisez pas explicitement dans votre code. Cela peut se produire assez souvent car il est bon de programmer en utilisant des interfaces et que déclarer la mise en œuvre concrète dans la configuration du réservoir.
Il existe essentiellement trois possibilités pour résoudre ceci:
• Ajouter une référence explicitement à ces classes dans votre code, même si elle n'est pas nécessaire. La plupart des développeurs le considèrent ce hack un vilain.
• Si vous souhaitez utiliser ces classes comme une bibliothèque, les compiler en un CFC (avec compc vous pouvez inclure des dossiers source tout dans le CFC), puis inclure la totalité de CFC dans votre SWF avec l'option -- Inclure les bibliothèques option du compilateur mxmlc. • Vous pouvez également inclure des cours individuels avec les inclut l'option du compilateur mxmlc.
3.4 ActionScript Configuration
Ce mécanisme de configuration mai semblent inconnus, si vous saviez Flex conteneurs du CIO à ce jour. Il est en quelque sorte similaire à Spring JavaConfig. Il vous permet de créer les objets qui doivent être gérés par le persil dans le code. Servons-nous de nouveau les deux classes à partir de l'exemple MXML et ajoutez-les au conteneur du CIO:
Code : Tout sélectionner
package com.bookstore.config {
class BookStoreConfig {
public const action:LoginAction = new LoginAction();
public function get service () : LoginServiceImpl {
var service:LoginServiceImpl = new LoginServiceImpl();
service.timeout = 3000;
return service;
}
}
}
Encore une fois nous définissons la propriété de délai d'attente, cette fois avec ActionScript. Notez que ce n'est pas grave si vous définir les objets comme une var, une constante ou une fonction getter implicite. Les objets de ces propriétés détiennent seront ajoutés au conteneur du CIO.
Bien entendu d'initialisation est de nouveau juste une seule ligne:
Code : Tout sélectionner
ActionScriptContextBuilder.build(BookStoreConfig);
Code : Tout sélectionner
<parsley:ContextBuilder config="{BookStoreConfig}"/>
Code : Tout sélectionner
[ObjectDefinition(singleton="false")]
public function get service () : LoginServiceImpl {
var service:LoginServiceImpl = new LoginServiceImpl();
service.timeout = 3000;
return service;
}
3.5 Durée de configuration
ajoutées dans la version 2.2 de ce mécanisme de configuration permet de spécifier les instances qui devraient faire partie du conteneur à l'exécution:
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:FlexConfig type="{ServiceConfig}"/>
<parsley:FlexConfig type="{ControllerConfig}"/>
<parsley:XmlConfig file="logging.xml"/>
<parsley:RuntimeConfig instances="{[instance1, instance2]}"/>
</parsley:ContextBuilder>
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:FlexConfig type="{ServiceConfig}"/>
<parsley:FlexConfig type="{ControllerConfig}"/>
<parsley:XmlConfig file="logging.xml"/>
<parsley:RuntimeConfig>
<parsley:Instance id="obj1" instance="{instance1}"/>
<parsley:Instance id="obj2" instance="{instance2}"/>
<parsley:Instance id="obj3" instance="{instance3}"/>
</parsley:RuntimeConfig>
</parsley:ContextBuilder>
Vous pouvez même utiliser les fonctions standard <Object> tags maintenant en ligne:
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:FlexConfig type="{ServiceConfig}"/>
<parsley:FlexConfig type="{ControllerConfig}"/>
<parsley:XmlConfig file="logging.xml"/>
<parsley:RuntimeConfig>
<parsley:Instance id="obj1" instance="{instance1}"/>
<parsley:Instance id="obj2" instance="{instance2}"/>
<parsley:Object id="obj3" type="{LoginInterceptor}"/>
<parsley:MessageInterceptor method="intercept" type="{LoginEvent}"/>
</parsley:Object>
</parsley:RuntimeConfig>
</parsley:ContextBuilder>
Code : Tout sélectionner
var rcp:RuntimeConfigurationProcessor = new RuntimeConfigurationProcessor();
rcp.addInstance(instance1, "id1");
rcp.addInstance(instance2, "id2");
rcp.addClass(MyClass, "id3");
var builder:CompositeContextBuilder = new DefaultCompositeContextBuilder(viewRoot);
FlexContextBuilder.merge(MainConfig, builder);
builder.addProcessor(rcp);
builder.build();
Bien que vous mai préfèrent s'en tenir à un mécanisme de configuration unique pour la plupart des applications simples, vous n'êtes pas obligé de le faire. Vous pouvez utiliser n'importe quelle combinaison des styles de configuration présentées dans ce chapitre, et même créer vos propres.
D'abord, vous mai souhaitez fractionner entre plusieurs fichiers de configuration / classes du style même configuration:
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:FlexConfig type="{BookStoreServices}"/>
<parsley:FlexConfig type="{BookStoreActions}"/>
</parsley:ContextBuilder>
Code : Tout sélectionner
XmlContextBuilder.buildAll(["services.xml", "actions.xml"]);
Code : Tout sélectionner
ActionScriptContextBuilder.buildAll([BookStoreServices, BookStoreActions]);
Code : Tout sélectionner
<parsley:ContextBuilder>
<parsley:FlexConfig type="{BookStoreServices}"/>
<parsley:FlexConfig type="{BookStoreActions}"/>
<parsley:XmlConfig file="logging.xml"/>
</parsley:ContextBuilder>
Code : Tout sélectionner
var builder:CompositeContextBuilder = new DefaultCompositeContextBuilder(this);
FlexContextBuilder.merge(BookStoreConfig, builder);
XmlContextBuilder.merge("logging.xml", builder);
builder.build();
Il est toujours simple: vous n'avez qu'à créer une instance de la classe DefaultCompositeContextBuilder et la transmettre à la fusion des méthodes des classes contexte différents constructeurs.
Dans tous ces exemples, le résultat final est un seul Persil Context. Pour toutes les caractéristiques de conteneurs du CIO comme Dependency Injection ou Messagerie ce n'est pas grave du tout comment vous répartissez objet de configuration entre les fichiers et les classes, le résultat est toujours le même que si elles ont été configurées dans un fichier unique.
Toutefois, pour les applications volumineuses et complexes, vous mai voulons créer des contextes modulaire, ce qui signifie que les objets de configuration multiple ne sont pas fusionnés en un seul contexte, de sorte qu'ils puissent être chargés et déchargés à la demande.
Pour les applications modulaires mai vous voulez lire 8 Bâtir des applications modulaires. Enfin si vous voulez créer votre propre mécanisme de configuration et de l'intégrer de façon transparente avec les styles de configuration existant, vous pouvez créer des implémentations de l'interface ConfigurationProcessor et passer ces implémentations pour CompositeContextBuilder.addProcessor. Voir 11 étendre le cadre pour plus de détails.