簡體   English   中英

Guice中的一個類的多個提供者

[英]Multiple provider for a class in Guice

我有一個Guice,其構造函數接受一個注入的參數:

@Singleton
public class MyClass {
    private MyConfiguration myConfiguration;

    @Inject
    public MyClass(MyConfiguration myConfiguration) {
        this.myConfiguration = myConfiguration;
    }
}

現在,我希望能夠注入參數取決於我運行的環境。 在Test中,我想在生產中注入一個MyConfiguration對象,我想要注入另一個對象。

我有兩個MyConfiguration提供程序。 MyConfigurationProvider讀取外部配置文件並從那里獲取配置。 MyConfigurationTestProvider只是對所有設置進行硬編碼。

我不知道怎么配置這個。 我試圖在Guice模塊中進行綁定,如:

public class MyGuiceModule extends AbstractModule {
    @Override
    protected void configure() {
       bind(MyConfiguration.class).toProvider(MyConfigurationProvider.class).in(Singleton.class);
    }
}

在測試的Guice模塊中,使用:

public class MyGuiceTestModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new MyGuiceModule());
        bind(MyConfiguration.class).toProvider(MyConfigurationTestProvider.class).in(Singleton.class);
    }
}

但這給了我綁定多個提供商的錯誤。

我的問題是,如何為同一個對象使用不同的提供程序取決於環境?

非常感謝。

是的,Guice模塊默認情況下不能包含多個具有相同鍵的綁定。 但是,您可以在創建進樣器時使用模塊的覆蓋功能。 此功能專為此目的而設計。

從測試模塊中刪除install() ,並為您的測試環境創建一個注入器,如下所示:

Injector injector = Guice.createInjector(Modules.override(new MyGuiceModule()).with(new MyGuiceTestModule()));

有了這個,你從測試模塊綁定MyConfiguration將取代生產模塊的綁定。

暫無
暫無

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

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