3

我正在尝试编写一个框架,其中任意 bean 类从我的 API 中注入类,它们可以与这两个类交互,也可以基于定义的注释触发回调。这是一个示例 bean:

@Experiment
static class TestExperiment {
    private final HITWorker worker;
    private final ExperimentLog log;
    private final ExperimentController controller;

    @Inject
    public TestExperiment(
        HITWorker worker,
        ExperimentLog expLog,
        ExperimentController controller
        ) {         
        this.worker = worker;
        this.expLog = expLog;
        this.controller = controller;
    }

    @SomeCallback
    void callMeBack() {
        ... do something

        log.print("I did something");
    }

}

我正在尝试使用 Guice 注入这些 bean 并处理注入的类之间的相互依赖关系。但是,我有两个问题:

  • 我传入的一个类 ( HITWorker) 已经实例化了。我无法看到如何将其移至 aProvider而不会显着复杂化我的代码。它也是持久的,但不是 Guice 定义的会话或请求范围,所以我现在自己管理它。(也许如果其他问题得到解决,我可以尝试把它放在提供者中。)
  • 更重要的是,我需要引用其他注入的类,以便对它们做适当的事情。当 Guice 注入它们时,我无法访问它们,因为 bean 类是任意的。

对于我基本上需要做的事情,这里有一些非常糟糕的代码,我确信这违反了所有正确的依赖注入概念。请注意,这hitw是我需要传入的唯一实例,但我也在创建其他依赖对象,因为我需要对它们的引用。有了这段代码,我基本上只将 Guice 用于它的反射代码,而不是它的依赖解析。

private void initExperiment(final HITWorkerImpl hitw, final String expId) {         
    final ExperimentLogImpl log = new ExperimentLogImpl();
    final ExperimentControllerImpl cont = new ExperimentControllerImpl(log, expManager);

    // Create an experiment instance with specific binding to this HITWorker
    Injector child = injector.createChildInjector(new AbstractModule() {
        @Override
        protected void configure() {
            bind(HITWorker.class).toInstance(hitw);
            bind(ExperimentLog.class).toInstance(log);
            bind(ExperimentController.class).toInstance(cont);
        }           
    });     

    Object experimentBean = child.getInstance(expClass);        

    expManager.processExperiment(expId, experimentBean);

    // Initialize controller, which also initializes the log
    cont.initialize(expId);

    expManager.triggerStart(expId);

    tracker.newExperimentStarted(expId, hitw, cont.getStartTime());
}

我搞砸了,只需要编写自己的注入代码,还是有办法正确地做到这一点?另外,我是否应该忘记这些 bean 类的构造函数注入,因为我不知道它们到底包含什么?如果我要求 Guice 注入 bean 而不是自己做,有什么方法可以获取依赖关系?

对于上下文,我已经阅读了 Guice 文档并查看了几天的示例,但无济于事。我不认为我是一个完整的编程白痴,但我不知道如何正确地做到这一点!

4

1 回答 1

1

从某种意义上说,您的“实验”似乎类似于“请求”,因为它具有定义的生命周期以及实验可以随意引入的一些相关内容。

因此,我认为您应该将所有这些包装到自定义范围中,如有关Custom Scopes的文档中所述。这在几个方面符合您的情况:

  • HITWorker您可以使用一些对象(您的)“播种”范围
  • 生命周期:在设置实验之前“进入范围”,在完成工作后“退出范围”。
  • 访问“共享”的东西,比如ExperimentLogExperimentController:将它们绑定到范围。然后框架和实验实例都可以@Inject将它们简单化并得到相同的实例。
于 2012-12-04T19:37:15.480 回答