2016-09-20 4 views
1

Я пытаюсь использовать пользовательскую аннотацию в hexMachina.Использовать пользовательскую аннотацию в hexMachina

В одном модуле, я зарегистрировать метаданные:

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

И в командовании, выполненный в Macro:

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

макросъемки выполняется в контексте:

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

applicationConfigUrl имеет значение

Что не хватает?

ответ

1

AnnotationProvider поставляет данные на основе ссылок на домен.

В предыдущем примере metadata is registered on module's domain, а экземпляр BootstrapMacro выполняется из домена основного контекста приложения (его родителя).

Чтобы решить эту проблему, я зарегистрировал аннотацию с доменов верхнего уровня:

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

При такой регистрации, аннотации будут доступны для каждого домена. Это связано с тем, что API AnnotationProvider обеспечивает автоматическое наследование для каждой регистрации для всех дочерних доменов с каскадным эффектом (дети детей ...).

1

Простое добавление, также возможно зарегистрироваться из основного контекста без таргетинга на домен верхнего уровня.

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

Модульные тесты могут помочь понять поведение. Они доступны here.

+0

И как вы получаете контекст от самого модуля или от службы? Это кажется невозможным. – Neverbirth

+0

Imho, было бы плохой практикой извлечь основной контекст из внутреннего компонента, потому что каждый компонент должен быть слепым черным ящиком без каких-либо знаний о глобальном мире. Кстати, если вы хотите, чтобы получить эту информацию, вот краткий пример извлекается из модульных тестов: 'вар annotationProvider = applicationAssembler.getContextFactory (applicationAssembler.getApplicationContext ("ApplicationContext")) .getAnnotationProvider(); \t \t annotationProvider.registerMetaData ("color", this.getColorByName); ' –

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