Используйте интерфейс с DI и @Creatable в приложении E4

Теперь с помощью аннотации @Creatable можно пометить класс для внедрения, не добавляя его в EclipseContext вручную в жизненном цикле:

http://blog.vogella.com/2012/02/29/eclipse-4-is-now-a-full-dependency-injection-container-with-creable/

Однако как насчет следующего сценария: скажем, у меня есть интерфейс SomethingService и некоторое количество реализаций, и я хочу сослаться на одну из них (то есть ту, которая аннотирована как создаваемая) по ее интерфейсу, что-то вроде:

@Creatable
class Todo implements SomethingService {
    @Inject
    public Todo(SomeArg arg) {
    // placeholder
    }
 }

 // Field Injection
 @Inject private SomethingService service;  // Todo instance 

Кажется, это вообще не работает. Есть ли способ добиться того, что мне нужно?


person mreparaz    schedule 20.05.2014    source источник
comment
У вас есть SomeArg в контексте Eclipse, чтобы его можно было найти? Eclipse выполняет внедрение только в объекты, о которых знает модель приложения (части, обработчики...).   -  person greg-449    schedule 21.05.2014
comment
Да, это. Это был просто пример, если я использую пустой конструктор, результат будет таким же.   -  person mreparaz    schedule 21.05.2014
comment
В какой класс вы пытаетесь внедрить SomethingService, как я уже сказал, это должно быть что-то, о чем знает модель приложения, иначе внедрение не будет выполнено, и вы получите нуль.   -  person greg-449    schedule 21.05.2014
comment
Да, я внедряю SometingService в часть из Application.e4xmi. На самом деле другие вещи внедряются правильно, например, декларативные службы или брокер событий. И если я заменю сервис SomethingService на сервис Todo, он сработает.   -  person mreparaz    schedule 22.05.2014


Ответы (1)


Ну, из того, что я мог видеть, то, что я прошу, должно быть сделано с помощью декларативных служб OSGi или, как в примере из «Разработка подключаемого модуля Eclipse 4 на примере», изменяющего активатор следующим образом:

public class Activator implements BundleActivator {
    public void start(BundleContext bundleContext) throws 
        InjectorFactory.getDefault().
           addBinding(IStringService.class).implementedBy(StringService.class);
    }
}

Спасибо

person mreparaz    schedule 19.06.2014