如何在我的 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
我有一个包含 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