Вы можете добавить экземпляр привязки, а затем использовать код АНИ по умолчанию, как описано в руководстве
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 Provider myServiceProvider ... // внутри метод вал MYSERVICE = myServiceProvider.get
Хорошо, и где я должен положить этот метод? Я немного невежественный. – Mino
к моменту выполнения или ui (runtimemodule не имеет доступных osgi). Я не знаю, если вы когда-либо называете свой код автономным без каких-либо ограничений osgi. –
Я думаю, на данный момент в среде затмения достаточно. Пробовал в MyDslRuntimeModule.java MyDslUiModule.java. Оба не были успешными. – Mino