Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse 如何在JvmModelInferrer中注入声明性服务_Eclipse_Xtext_Declarative Services - Fatal编程技术网

Eclipse 如何在JvmModelInferrer中注入声明性服务

Eclipse 如何在JvmModelInferrer中注入声明性服务,eclipse,xtext,declarative-services,Eclipse,Xtext,Declarative Services,我有一个xtext项目,其中包含MyDslJvmModelInferrer。 在此示例中,我希望使用声明性服务(如中所述定义),并在服务中处理解析后的模型 如何在ModelInferrer中访问声明性服务 谢谢,这是事先准备好的 您可以添加实例绑定,然后使用教程中描述的默认api代码 def void configureMyService(Binder binder) { val BundleContext bundleContext = FrameworkUtil.getBundle(

我有一个xtext项目,其中包含MyDslJvmModelInferrer。 在此示例中,我希望使用声明性服务(如中所述定义),并在服务中处理解析后的模型

如何在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)
}
创建提供者类

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
    }

}
import com.google.inject.Provider
类MyServiceProvider实现提供程序{
覆盖get(){
val BundleContext BundleContext=FrameworkUtil.getBundle(this.getClass()).getBundleContext();
val ServiceReference ServiceReference=bundleContext.getServiceReference(IMyService.getName());
val IMyService service=bundleContext.getService(serviceReference)作为IMyService;
回程服务
}
}
并使用它 导入com.google.inject.Provider ... @注入提供程序myServiceProvider ... // 内法
val myService=myServiceProvider.get

Ok,我应该把这个方法放在哪里?对于运行时或ui模块(runtimemodule没有可用的osgi),我不知道您是否曾经在没有osgi环境的情况下单独调用代码。我猜,目前在eclipse环境中是不够的。在MyDslUiModule.java和MyDslUiModule.java中尝试了它。两个都不成功。你的错误是什么?您调试了cofigure方法吗?也许osgi服务尚未创建,您需要注入并调用MyServiceProider?我还将为此添加一些伪代码,我创建了MyServiceProvider,MyDslUiModule.java中的provideMyService方法,但似乎没有调用此方法。我用一个简单的println测试了它。但我的服务必须是可感知的。我在另一个同时运行的项目中使用了它。控制台中存在类似这样的错误:没有绑定MyService的实现。在org.eclipse.xtext.service.MethodBasedModule.configure(MethodBasedModule.java:57)的mydsljvmModelInferer.lpServiceProvider(未知源)中查找com.google.inject.Provider for字段时
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
    }

}