Как внедрить несколько экземпляров службы в eclipse e4?

Ни @Inject MyService[] services, ни @Inject Collection<MyService> не работают для получения нескольких экземпляров одной и той же службы.

Похоже, что ребята из eclipse не предлагают «простого» решения, см.: Ошибка 413147.

Ларс Фогель предлагает:

Я думаю, что правильное решение для клиентов, желающих такой функциональности, — это определить поставщика расширенных объектов. В настоящее время у нас нет планов по поддержке внедрения нескольких значений через DI.

Но как это сделать, я ничего не могу найти об этом? Или вместо этого я должен использовать ServiceTracker?


person Chriss    schedule 17.06.2014    source источник


Ответы (1)


Вы используете класс, расширяющий ExtendedObjectSupplier, чтобы обеспечить реализацию аннотации квалификатора для внедрения. Итак, если ваша аннотация @MyService, вы можете сделать:

@Inject @MyService
MyService [] services;

Класс поставщика расширенных объектов отвечает за поиск значений, которые необходимо внедрить. Таким образом, вы можете использовать ServiceTracker в поставщике.

Подробнее об использовании ExtendedObjectSupplier здесь

Обновить сводку по использованию 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
  }
}
person greg-449    schedule 17.06.2014
comment
Можете ли вы процитировать соответствующее содержание ссылки? См. Предоставление контекста для ссылок stackoverflow.com/help/how-to-answer, чтобы другие знали, что делать. , если связанная страница исчезнет. - person Chriss; 18.06.2014