我想解决以下问题并需要建议,最好的解决方案是什么。
我有一个包 A,其中定义了服务接口 X。包 B 提供 X 的服务实现并将实现贡献给工具。A 和 B 使用 Google Guice 和 Peaberry 来配置对象的设置。
我可以使用两种可能性来贡献服务实现:
- 使用 eclipse 扩展:在这个解决方案中,我可以使用 Peaberry 的GuiceExtensionFactory机制来使用 Guice 创建服务实现,因此可以注入实现所需的东西。这里的缺点是,在定义扩展点的包中,我需要用于解析扩展的样板代码,因为据我所知,无法将扩展注入到使用扩展的类中。这看起来像这样:
<extension point="A.service.X">
<xservice
...
class="org.ops4j.peaberry.eclipse.GuiceExtensionFactory:B.XImpl"
.../>
</extension>
<extension
point="org.ops4j.peaberry.eclipse.modules">
<module
class="B.XModule">
</module>
</extension>
但我需要这样的样板代码:
private List<X> getRegisteredX() {
final List<X> ximpls = new ArrayList<>();
for (final IConfigurationElement e : Platform.getExtensionRegistry().getConfigurationElementsFor( X_EXTENSION_POINT_ID)) {
try {
final Object object = e.createExecutableExtension("class"); //$NON-NLS-1$
if (object instanceof X) {
ximpls.add((X) object);
}
} catch (final CoreException ex) {
// Log
}
}
return ximpls;
}
- 使用 OSGI 服务:我的主要问题是确保服务已注册。我希望延迟加载捆绑包,因此至少需要访问捆绑包的类之一。使用 Peaberry 以编程方式注册服务是有问题的,因为没有人要求提供捆绑包的类。解决方案是将服务作为声明性服务提供,但我不知道以某种方式创建服务实现的方法,即我可以使用 Guice 注入所需的对象。
所以我有一些问题:
- 到目前为止,有没有什么我不知道的东西可以实现在扩展点通用读取扩展所需的代码并允许使用扩展将扩展注入到类中?
- 有没有办法确保即使使用标准 Peaberry 机制添加服务(即在请求服务时激活捆绑包)也能提供服务?
- 有没有像GuiceExtensionFactory这样的声明式服务的方式,让服务实现的创建可以通过 bundle 的注入器来完成?看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Ximpl">
<implementation class="some.generic.guiceaware.ServiceFactory:B.Ximpl"/>
<service>
<provide interface="A.X"/>
</service>
</scr:component>
总而言之,我想要一个由 Guice 生成的服务实现,并且我希望使用该服务将服务实现简单地注入到类中,而无需大量样板代码。有没有人解决这个问题?
抱歉,问一下,但是我在网上搜索了很长时间,到目前为止我还没有找到解决方案。
谢谢和最好的问候, 拉斯