我有以下课程:

public class CacheModule extends AbstractModule {
    @Override
    protected void configure() {
        bindConstant().annotatedWith(Names.named(TIMEOUT")).to(60);
        // ...etc.
    }
}

public class DefaultCacheAdaptor implements CacheAdaptor {
    private CacheModule bootstrapper = new CacheModule();

    @Named("TIMEOUT") private int timeout;

    // other fields omitted for brevity

    public DefaultCacheAdaptor() {
        super();

        Injector injector = Guice.createInjector(bootstrapper);

        @Named("TIMEOUT") int t = injector.getInstance(Integer.class);
        setTimeout(t);
    }
}

public class QueueModule extennds AbstractModule {
    @Override
    public void configure() {
        bind(CacheAdaptor.class).to(DefaultCacheAdaptor.class);
    }
}

public class DefaultQueueAdaptor implements QueueAdaptor {
    private QueueModule bootstrapper = new QueueModule();

    private CacheAdaptor cacheAdaptor;

    public DefaultQueueAdaptor() {
        super();

        Injector injector = Guice.createInjector(bootstrapper);

        setCacheAdaptor(injector.getInstance(CacheAdaptor.class));
    }
}


CacheModule / CacheAdaptor / DefaultCacheAdaptorQueueModule / QueueAdaptor / DefaultQueueAdaptor位于不同的JAR中,因此,后者(在运行时)显然取决于前一个JAR。

这样编写代码的目的是允许CacheModule在用户编写以下内容时将DefaultCacheAdaptor整个对象图升压/注入:

CacheAdaptor cacheAdaptor = new DefaultCacheAdaptor();


同上QueueAdaptor

恰好是QueueAdaptor被注入了CacheAdaptor

但是,DefaultCacheAdaptor是其自己的对象树的“根”,并且应始终由CacheModule注入。

所以我问:如何从DefaultCacheAdaptor内部将CacheAdaptor绑定到QueueModule,但是要确保DefaultCacheAdaptor本身是由CacheModule初始化/引导的?提前致谢!

最佳答案

坦白地说,听起来这个问题实际上不是Guice的问题,而是整个软件工程中的标准问题:确保您的依赖项按照他们的要求去做。 QueueModule不必担心DefaultCacheAdaptor是否遵守其一般合同。而是为DefaultCacheAdaptor编写一个单元测试,以确保它会自行引导,然后无需考虑即可在QueueModule中使用它。

这尤其如此,因为DefaultCacheAdaptor具有完全不相关的注入器树。您应该能够不透明地使用DefaultCacheAdaptor,并停止将QueueAdaptor及其实现详细信息纳入考虑范围。它的引导程序是其实现的一部分,而不是其API。

即使您将两个Injector图合并为一个(例如,通过injecting the Injector并调用createChildInjector),也几乎没有办法保证在编译时其他模块中所需的绑定将存在,因为Module在运行时的工作。最好的选择是编写一个单元测试。您可以通过调用requireBinding更快地失败,如果在外部无法最终满足特定的依赖关系,则会在创建Injector时失败。

关于java - 吉斯:注入(inject)另一个模块绑定(bind)的类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18599564/

10-13 04:32