如何在我的 JvmModelInferrer 中注入声明式服务

How to inject a declarative service my JvmModelInferrer

我有一个包含 MyDslJvmModelInferrer 的 xtext 项目。 在这个推断器中,我想使用我的声明式服务,它的定义如 this tutorial 中所述,并在服务中处理已解析的模型。

如何访问我的 ModelInferrer 中的声明式服务?

提前致谢。

您可以添加实例绑定,然后使用教程中所述的默认 api 代码

def void configureMyService(Binder binder) {
    val BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); 
    val ServiceReference<?> serviceReference = bundleContext.getServiceReference(IMyService.getName());
    val IMyService service = bundleContext.getService(serviceReference) as IMyService; 
    binder.bind(IMyService).toInstance(service)
}

那么正常的 @Inject IMyService myService 应该可以工作

更新:我不知道 osgi 服务什么时候可用,所以你可能不得不懒惰地做这个

在模块中

import com.google.inject.Provider
...
def Provider<IMyService> provideIMyService() {
    return new MyServiceProvider
}

创建提供者class

import com.google.inject.Provider
class MyServiceProvider implements Provider<IMyService> {

    override get() {
        val BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); 
        val ServiceReference<?> serviceReference = bundleContext.getServiceReference(IMyService.getName());
        val IMyService service = bundleContext.getService(serviceReference) as IMyService; 
        return service
    }

}

并使用它 导入 com.google.inject.Provider ... @Inject 提供者 myServiceProvider ... // 内部方法 val myService = myServiceProvider.get