如何在eclipse e4中注入多个服务实例?

时间:2014-06-17 14:42:35

标签: java eclipse dependency-injection eclipse-rcp e4

@Inject MyService[] services@Inject Collection<MyService>都无法获取同一服务的多个实例。

看起来日食家伙并没有提供一个简单的&#34;解决方案,请参阅:Bug 413147

Lars Vogel建议:

  

我认为对客户而言,正确的解决方案是希望功能是定义扩展对象供应商。目前,我们还没有计划通过DI支持多个值的注入。

但是怎么做,我找不到任何关于它的东西?或者我应该使用ServiceTracker吗?

1 个答案:

答案 0 :(得分:0)

使用扩展ExtendedObjectSupplier的类来提供注入的限定符注释的实现。因此,如果您的注释为@MyService,则可以执行以下操作:

@Inject @MyService
MyService [] services;

扩展对象供应商类负责查找要注入的值。因此,您可以在供应商中使用ServiceTracker

有关使用ExtendedObjectSupplier here

的更多信息

更新使用ExtendedObjectSupplier的摘要

创建注释:

@Qualifier
@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyService {   
} 

使用“新组件定义”

为供应商创建OSGi服务定义
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="greg.music.core.preferenceSettings">
   <implementation class="package.MyServiceObjectSupplier"/>
   <property name="dependency.injection.annotation" type="String" value="package.MyService"/>
   <service>
      <provide interface="org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier"/>
   </service>
</scr:component>

MANIFEST.MF应在Service-Component

中引用此文件

供应商类似乎:

public class MyServiceObjectSupplier extends ExtendedObjectSupplier
{
  @Override
  public Object get(final IObjectDescriptor descriptor, final IRequestor requestor, final boolean track, final boolean group)
  {
     // TODO return the object to inject
  }
}