1

如果我解释我想要做的事情的上下文,希望你能明白我的意思:我正在尝试在我的 JavaFX 项目中将 Dagger 与 Gluon Ignite 库一起使用。

我的设置有点奇怪:
我有一个 EJB 项目,其中包含几个应该在客户端之间共享的类。它包含两个用@Stateless 和@Singleton 注释的类,因此它们可以作为EJB 部署在应用程序服务器上。我想从独立的 JavaFX 应用程序中使用 EJB 模块的类。因此,JavaFX 客户端应该可以在没有将 EJB 部署到应用程序服务器的情况下工作。

因此,我告诉 gradle 将 EJB 类打包到 JavaFX 应用程序中。EJB 模块也是通过 gradle 多项目构建创建的 EAR 项目的一部分,以使其可部署。JavaFX 的构建独立于 EAR 模块和多项目配置。现在我想使用 Dagger (Gluon Ignite) 从 EJB 模块注入服务。如果可能的话,我不想用任何特定于 dagger 的代码“污染”EJB 类,以便仍然能够将其部署为标准 EJB 模块。此外,EJB 应该能够请求彼此的实例。我不敢相信它不起作用,因为 Dagger 基于 JSR-330 标准注释。

通过添加,我只能在我的 Application 类中进行注入

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

我写了一个匕首模块,它只包含一个应该通过接口注入的类的提供者。对于其他类,我将@Inject 添加到它们的无参数构造函数中。据我了解,context.init();应用程序类的 start 方法中的方法调用(属于 Gluon Ignite)会导致发生字段注入。与此相反,我发现解决除我的 Application 类之外的其他类中的依赖关系的一种方法是手动编写如下内容:

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

否则,通过使用 @Inject 注释字段,它们将保持为空。对我来说,这看起来像是我讨厌在我的 EJB 类中使用的烦人的样板代码。我真的必须手动编写类似的东西吗?也许我把整个概念弄错了。

4

1 回答 1

0

ModuleDagger 仍然要求您在注释中列出类。这是 Ignite Dagger 示例中的模块定义。注意“注入”属性:

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

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

}
于 2016-04-01T00:04:33.500 回答