@Inject MyService[] services
和@Inject Collection<MyService>
都无法获取同一服务的多个实例。
看起来日食家伙并没有提供一个简单的&#34;解决方案,请参阅:Bug 413147。
Lars Vogel建议:我认为对客户而言,正确的解决方案是希望功能是定义扩展对象供应商。目前,我们还没有计划通过DI支持多个值的注入。
但是怎么做,我找不到任何关于它的东西?或者我应该使用ServiceTracker吗?
答案 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
}
}