簡體   English   中英

吉斯:注入另一個模塊綁定的類嗎?

[英]Guice: Inject a class bound by another module?

我有以下課程:

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注入。

那么請問: 我該怎么綁定DefaultCacheAdaptorCacheAdaptor從內QueueModule ,但確保DefaultCacheAdaptor本身初始化/由自舉CacheModule 提前致謝!

坦白地說,聽起來這個問題實際上不是Guice的問題,而是整個軟件工程中的標准問題:確保您的依賴項按照他們的要求去做。 QueueModule不必擔心DefaultCacheAdaptor是否遵守其一般合同。 而是為DefaultCacheAdaptor編寫一個單元測試,以確保它會自行引導,然后無需考慮即可在QueueModule中使用它。

這尤其如此,因為DefaultCacheAdaptor具有完全不相關的注入器樹。 您應該能夠不透明地使用DefaultCacheAdaptor,並停止將QueueAdaptor及其實現詳細信息納入考慮范圍。 它的引導程序是其實現的一部分,而不是其API。

即使您將兩個Injector圖合並為一個(例如,通過注入Injector並調用createChildInjector ),也幾乎沒有辦法保證在編譯時其他模塊中所需的綁定將存在,因為Module在運行時有效。 最好的選擇是編寫一個單元測試。 您可以通過調用requireBinding更快地使失敗,如果在外部無法最終滿足特定的依賴關系,則在創建Injector時將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM