2016-03-31 5 views
1

Надеюсь, вы поймете, что я имею в виду под вопросом, если я объясню контекст того, что я хочу сделать: Я пытаюсь использовать Кинжал с библиотекой Gluon Ignite в моем проекте JavaFX.Как запросить экземпляры, управляемые кинжалом, только с помощью аннотации @Inject во всех классах?

Моя настройка немного странная:
У меня есть проект EJB, содержащий несколько классов, которые должны совместно использоваться клиентами. Он содержит два класса, аннотированные с @Stateless и @Singleton, поэтому они развертываются как EJB на сервере приложений. Я хочу использовать классы модуля EJB из автономного приложения JavaFX. Таким образом, клиент JavaFX должен работать без EJB, развернутых на сервере приложений.

Для этого я сказал gradle, чтобы упаковать классы EJBs в приложении JavaFX. Модуль EJB также является частью проекта EAR, который создается посредством многопроектной сборки gradle, чтобы сделать его доступным для развертывания. Построение JavaFX не зависит от модуля EAR и многопроектной конфигурации. Теперь я хочу использовать Кинжал (Gluon Ignite), чтобы внедрить сервисы из модуля EJB. Если возможно, я не хочу «переуступать» классы EJB с любым кодом, предназначенным для кинжалов, чтобы все еще иметь возможность развертывать его как стандартный модуль EJB. Также EJB должны иметь возможность запрашивать экземпляры друг друга. Я не могу поверить, что это не сработало, поскольку Кинжал основан на стандартных аннотациях JSR-330.

Я получил инъекцию работает только из моего класса Application, добавив

private final DIContext context = new DaggerContext(this,() -> Arrays.asList(new DaggerApplicationModule())); 
@Inject 
GlobalService globalService; 

Я написал один модуль кинжала, который содержит только поставщик для класса, который должен вводиться через интерфейс. Для других классов я добавил @Inject в свой конструктор без аргументов. Насколько я понимаю, вызов метода context.init(); (принадлежащий Gluon Ignite) в методе запуска класса приложения вызывает инжекцию поля. В отличии от этого я понял, что один из способов разрешения зависимостей в других классах, чем мой класс Приложения вручную писать что-то вроде этого:

ObjectGraph og = ObjectGraph.create(new DaggerApplicationModule()); 
globalService = og.get(GlobalService.class); 

В противном случае, по аннотированию поля с @Inject, они остаются нулевыми , Для меня это выглядит как раздражающий шаблонный код, который я бы не хотел иметь в своих классах EJB. Должен ли я писать что-то подобное вручную? Может быть, я ошибаюсь.

ответ

0

Кинжал по-прежнему требует, чтобы вы указали классы в аннотации Module. Вот определение модуля из примера Ignite Dagger. Обратите внимание на атрибут «injects»:

@Module(library = true, injects = {DaggerApp.class,ViewController.class}, complete = false) 
class DaggerModule { 

    @Provides 
    public Service provideService() { 
     return new Service(); 
    } 

} 
+0

Ну, конечно, я сделал пробную версию и ошибку с атрибутом injects. В моей конфигурации единственным классом, требуемым компилятором, является класс приложения. Для моего понимания было бы также разумно рассказать кинжалу о классе ViewController, поскольку он является точкой входа ObjectGraph и не создан самим кинжалом, но, к сожалению, это не имеет никакого значения. – MannikJ