繁体   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