Как я могу использовать внедрение зависимостей в приложении Gluon Desktop?

Кто-нибудь знает, есть ли простой способ использовать внедрение зависимостей в контроллерах FXML приложения Gluon Desktop (ParticleApplication)? Уже используется @Inject для таких вещей, как

public class HomeController {

    @Inject ParticleApplication app;

    @Inject private ViewManager viewManager;

    @Inject private StateManager stateManager;

(как часть фреймворка), но я хотел бы иметь возможность @Inject свои собственные объекты.


EDIT: ответ предложил использовать Gluon Ignite, но мне все еще не удается понять это. Вот некоторые из моих попыток кода:

Мой класс ParticleApplication:

package com.gluonapplication;

import com.gluonhq.ignite.guice.GuiceContext;
import com.gluonhq.particle.application.ParticleApplication;
import com.google.inject.AbstractModule;
import javafx.scene.Scene;

import java.util.Arrays;

public class GluonApplication extends ParticleApplication {

    private GuiceContext context = new GuiceContext(this, () -> Arrays.asList(new GuiceModule()));

    public GluonApplication() {
        super("Gluon Desktop Application");

        context.init();
        System.out.println("From within GluonApplication Constructor: " +
                context.getInstance(TestClassToInject.class).testDependancy.testString
        );
    }

    @Override
    public void postInit(Scene scene) {
        setTitle("Gluon Desktop Application");
    }

    class GuiceModule extends AbstractModule {
        @Override protected void configure() {
            // Use just in time injection.
        }
    }
}

Класс моего контроллера:

package com.gluonapplication.controllers;

import com.gluonapplication.TestClassToInject;
import com.gluonhq.particle.application.ParticleApplication;
import com.gluonhq.particle.state.StateManager;
import com.gluonhq.particle.view.ViewManager;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javax.inject.Inject;

public class PrimaryController {

    @Inject ParticleApplication app;

    @Inject private ViewManager viewManager;

    @Inject private StateManager stateManager;

    @Inject private TestClassToInject testClassToInject;

    @FXML
    private Label label;

    public void initialize() {
    }

    public void postInit() {
        System.out.println("From within controller's postInit() method: " +
                testClassToInject.testDependancy.testString
        );
    }

    public void dispose() {
    }
}

И затем мои два класса созданы как зависимости:

package com.gluonapplication;

import javax.inject.Inject;

public class TestClassToInject {
    @Inject
    public TestDependancy testDependancy;

    public TestClassToInject() {
    }
}

package com.gluonapplication;

public class TestDependancy {
    public String testString = "This is a test string";

    public TestDependancy() {
    }
}

И, наконец, мой файл Gradle:

apply plugin: 'java'
apply plugin: 'application'

repositories {
    jcenter()
    maven {
        url 'http://nexus.gluonhq.com/nexus/content/repositories/releases'
    }
}

mainClassName = 'com.gluonapplication.GluonApplication'

dependencies {
    compile 'com.gluonhq:particle:1.1.0'
    compile 'com.gluonhq:ignite-guice:1.0.0'
}

"From within GluonApplication Constructor: " + context.getInstance(TestClassToInject.class).testDependancy.testString распечатывается просто отлично, поэтому я думаю, что у меня есть классы зависимостей, и Guice настроен нормально. Однако System.out.println("From within controller's postInit() method: " + testClassToInject.testDependancy.testString); не работает внутри контроллера, потому что testClassToInject во время использования имеет значение null.


person Community    schedule 19.04.2016    source источник


Ответы (1)


Вы можете использовать Gluon Ignite (http://gluonhq.com/open-source/ignite/). ), который поддерживает внедрение зависимостей с помощью Dagger, Guice и Spring. Gluon Ignite — это проект с открытым исходным кодом, и вы можете найти пример в тестовом каталоге на веб-сайте репозитория: https://bitbucket.org/gluon-oss/ignite/src/c85197b33852/src/test/java/com/gluonhq/ignite/?at=default

person Joeri Sykora    schedule 19.04.2016
comment
Это похоже на то, что я искал, но я все еще не могу заставить его работать. Внутри моего контроллера я все еще получаю null для своих внедренных классов. Знаете ли вы, имеет ли значение, что я расширяю ParticleApplication вместо Application, как в примере? ParticleApplication не имеет метода start, должен ли я использовать postInit для context.init()? Я постараюсь опубликовать часть своего кода в своем вопросе в ближайшее время. - person ; 20.04.2016
comment
Обычно для внедрения TestClassToInject должен быть определен в одном из ваших модулей. Только после этого он становится инъекционным. Это означает, что этот класс должен быть создан Guice. В Ignite есть способ эмулировать это поведение, если вы не можете этого сделать по какой-либо причине: создайте экземпляр TestClassToInject себя, а затем вызовите context.injectMembers(instance) - person Eugene Ryzhikov; 20.04.2016
comment
Спасибо за терпение, я все еще изучаю DI, поэтому могу что-то упустить. Я уже могу создать класс TestClassToInject, используя context.getInstance(TestClassToInject.class) внутри моего основного класса приложения GluonApplication, который расширяет ParticleApplication (так что я думаю, что материал Guice работает нормально, поскольку TestClassToInject имеет открытый конструктор noarg). Проблема в том, что я не могу внедрить его в контроллеры (например, класс PrimaryController, созданный плагином IntelliJ Gluon, когда вы создаете Gluon Desktop - Multiple View Project with FXML). - person ; 24.04.2016
comment
Полтора года спустя, и я пытаюсь сделать то же самое с таким же отсутствием результатов. Приведенные примеры ignite не показывают, как работать с фреймворком Gluon Desktop. В рекламных объявлениях о рабочем столе говорится, что он предварительно создан для работы с зажиганием, но я, хоть убей, не могу понять, как это работает. Под прикрытием Gluon Desktop есть ParticleInjector, который выполняет все инъекции, и я просто не понимаю, как внешний инжектор (например, guice/ignite) может работать с этим без огромного клада. Если кто-то из глюонных разработчиков смотрит, будет рад услышать ваше мнение. А пока, прощай, глюонный рабочий стол. - person chooks; 02.11.2017