【问题标题】:How to inject a declarative service my JvmModelInferrer如何注入声明式服务我的 JvmModelInferrer
【发布时间】:2016-01-03 16:49:16
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: eclipse xtext declarative-services


    【解决方案1】:

    您可以添加实例绑定,然后使用教程中描述的默认 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
    }
    

    创建提供者类

    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

    【讨论】:

    • 好的,我必须把这个方法放在哪里?我有点不知所措。
    • 到运行时或 ui 模块(运行时模块没有可用的 osgi)我不知道你是否曾经在没有 osgi 环境的情况下独立调用你的代码
    • 我想,目前在 Eclipse 环境中已经足够了。在 MyDslRuntimeModule.java 和 MyDslUiModule.java 中尝试过。两者都没有成功。
    • 你得到的错误是什么?您是否调试了 cofigure 方法?也许尚未创建 osgi 服务,您需要注入并调用 MyServiceProider 吗?我也会为此添加一些虚拟代码
    • 我在MyDslUiModule.java中创建了MyServiceProvider方法provideMyService,但是好像没有调用这个方法。我用一个简单的 println 对其进行了测试。但是我的服务必须是可用的。我在另一个同时运行的项目中使用它。控制台中有这样的错误:没有绑定 MyService 的实现。同时在 org.eclipse.xtext.service.MethodBasedModule.configure(MethodBasedModule.java:57) 中为 MyDslJvmModelInferrer.lpServiceProvider(Unknown Source) 的字段定位 com.google.inject.Provider
    猜你喜欢
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多