2016-09-20 1 views
1

J'essaie d'utiliser l'annotation personnalisée dans hexMachina.Utiliser une annotation personnalisée dans hexMachina

Dans un module, enregistrer mon métadonnées:

this._annotationProvider.registerMetaData("Url", this.urlProviderModel.getUrl) 

Et dans une commande exécutée dans une macro:

@Url("applicationConfig") 
public var applicationConfigUrl:String; 

La macro est exécuté dans le contexte:

<state id="assemblingEnd" ref="applicationContext.state.ASSEMBLING_END"> 
    <enter command-class="app.adapter.bootstrap.BootstrapMacro" fire-once="true"/> 
</state> 

applicationConfigUrl a null

Qu'est-ce qui manque?

Répondre

1

AnnotationProvider fournit des données basées sur des références de domaine.

Dans l'exemple précédent, metadata is registered on module's domain, et l'instance BootstrapMacro est exécutée à partir du domaine du contexte de l'application principale (son parent).

Pour résoudre le problème, je me suis inscrit à l'annotation TopLevelDomain avec:

AnnotationProvider.getAnnotationProvider().registerMetaData("Url", urlProviderModule.getUrlFunction()); 

Avec ce type d'inscription, l'annotation sera disponible à tous les domaines. En effet, l'API AnnotationProvider fournit un héritage automatique pour chaque enregistrement à tous les domaines enfants, avec un effet en cascade (enfants d'enfants ...).

1

Juste un ajout rapide, il est également possible de s'enregistrer à partir de votre contexte principal sans cibler le domaine de premier niveau.

AnnotationProvider.getAnnotationProvider(context.getDomain()).registerMetaData("Url", urlProviderModule.getUrlFunction()); 

Les tests unitaires peuvent aider à comprendre les comportements. Ils sont disponibles here.

+0

Et comment obtenez-vous le contexte à partir du module lui-même ou d'un service? Cela ne semble pas possible. – Neverbirth

+0

Imho, ce serait une mauvaise pratique de récupérer le contexte principal d'un composant interne, car chaque composant devrait être une boîte noire aveugle sans aucune connaissance du monde global. BTW, si vous souhaitez récupérer ces informations, voici un exemple rapide extrait de tests unitaires: 'var annotationProvider = applicationAssembler.getContextFactory (applicationAssembler.getApplicationContext ("applicationContext")) .getAnnotationProvider(); \t \t annotationProvider.registerMetaData ("color", this.getColorByName); ' –