gpt4 book ai didi

guice - guice中的模块层次结构

转载 作者:行者123 更新时间:2023-12-04 07:12:59 25 4
gpt4 key购买 nike

我想运行一个单元测试,其中常量与标准版本略有不同。也就是说,在我的默认模块中,以下是

bindConstant().annotatedWith(Names.named("number of players")).to(4);

但在测试中,我想试试这条线:
bindConstant().annotatedWith(Names.named("number of players")).to(2);

我想在不复制模块的所有其余部分的情况下实现这一点。我真正想要的是一个“默认”模块,它“低于”一个更专业的模块,这样在发生冲突时,专业模块获胜(而不是抛出异常,这是 guice 所做的)。

本质上,我的问题是:如何在没有大量代码重复的情况下安排多个模块?

更新 :我意识到解决方案实际上是使用工厂,而不是在这个用例中使用常量。不过,我仍然有兴趣了解是否有类似模块层次结构的东西。

最佳答案

通常,当正确使用 Guice 时,您根本不需要在测试中使用 Guice(尤其是单元测试......集成和端到端测试,是的)。反正:

我不确定我是否了解您要做什么或问题到底是什么,但是...您在创建 Injector 时意识到这一点您可以提供任意数量的Module对吧?这是使用 Guice 的关键部分。根据需要使模块成为类(class)或细粒度。你可以有一个 NumberOfPlayersModule只有一个绑定(bind),然后有时使用具有不同绑定(bind)的不同模块(例如用于您的测试)。您还可以创建一个带有构造函数参数的模块并将模块创建为 new NumberOfPlayersModule(4)new NumberOfPlayersModule(2)随你便。

Guice 还有另一个特性,它允许您使用来自一个或多个其他模块的绑定(bind)来覆盖一个或多个模块中的绑定(bind)。像这样工作:

// FooModule is your module that contains the "number of players" binding and
// some others

Module override = Modules.override(new FooModule())
.with(new AbstractModule() {
protected void configure() {
bindConstant().annotatedWith(Names.named("number of players")).to(2);
}
});
Injector injector = Guice.createInjector(override);
// The int @Named("number of players") for the injector is 2

如您所见,确实有很多方法可以让您以不同的方式轻松配置应用程序。

关于guice - guice中的模块层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2900473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com