【发布时间】:2013-02-15 06:56:30
【问题描述】:
我有一个使用 Guice 并从配置文件中读取一些配置设置的应用程序。我是这样加载的:
@Provides @Singleton
Settings provideSettings() {
// code that loads the settings
}
某些对象需要某些设置,其他对象需要其他设置。在我看来,在构造函数中传递这些东西是有意义的,但最终我得到了很多样板代码,比如:
@Provides @Named("integerValueSetting1")
int provideIntegerValueSetting1(Settings settings) {
return settings.getInteger("integerValueSetting1");
}
而且我必须为每一种设置类型创建这样一个@Provides 方法,而且我必须在构造函数中注释适当的设置。像这样:
@Inject
public MyClass(@Assisted String objectName, @Named("integerValueSetting1") myValue) {
// blah blah constructor
}
这似乎并没有为我节省多少!更糟糕的是,如果我为每个设置参数创建了一个自定义注释类。一定有更好的方法吧?
一种解决方案是直接传递 Settings 对象,但这违反了best practices: Inject only direct dependencies...
【问题讨论】:
-
设置是直接依赖。仅仅因为您不调用 Settings 对象的每个方法并不意味着它不是直接依赖项。
-
@JBNizet 好吧,我确实有一个与设置对象关联的接口......现在它只是从一个平面文件中读取,但我想稍后将它变成一个数据库。但我想无论哪种方式它都会有相同的界面......
-
所以,直接注入设置。要进行单元测试,您只需注入一个模拟设置对象并存根被测对象使用的方法。依赖注入的经典用法。
标签: java guice named-parameters