2016-09-20 113 views
1

我尝试在hexMachina中使用自定义注释。在hexMachina中使用自定义注释

在一个模块中,注册我的元数据:

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

而且在命令,在宏执行:

@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实例是从主应用程序上下文的域(其父级)执行的。

要解决这个问题,我已经注册了注释一起TopLevelDomain:

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

有了这种登记,注释将提供给每一个领域。这是因为AnnotationProvider API为每个注册到所有子域提供了自动继承,并且具有级联效果(儿童的子...)。

1

只是一个快速此外,它也可以从你的主要方面,而不针对顶级域名注册。

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

单元测试可以帮助理解行为。它们可here.

+0

你如何得到模块本身或从服务语境?这似乎不可能。 – Neverbirth

+0

Imho,从内部组件检索主要上下文将是一种不好的做法,因为每个组件都应该是一个盲目的黑匣子,对全球世界没有任何了解。 顺便说一句,如果你想获取这些信息,下面是从单元测试中提取一个简单的例子: 'VAR annotationProvider = applicationAssembler.getContextFactory(applicationAssembler.getApplicationContext( “ApplicationContext” 中)).getAnnotationProvider(); \t \t annotationProvider.registerMetaData( “颜色”,this.getColorByName);' –