1

我有一个 Guice,它的构造函数接受注入的参数:

@Singleton
public class MyClass {
    private MyConfiguration myConfiguration;

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

现在,我希望能够注入参数取决于我运行它的环境。在测试中,我想注入一个 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);
    }
}

但这给了我一个绑定多个提供者的错误。

我的问题是我如何为同一个对象使用不同的提供者取决于环境?

非常感谢。

4

1 回答 1

3

是的,Guice 模块默认不能包含多个具有相同键的绑定。但是,您可以在创建注入器时使用模块的覆盖功能。此功能正是为此目的而设计的。

从您的测试模块中删除install()东西并为您的测试环境创建一个注入器,如下所示:

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

这样,您对MyConfiguration来自测试模块的绑定将替换来自生产模块的绑定。

于 2013-05-17T10:52:08.067 回答