我有一個應用程序使用Guice並從配置文件中讀取一些配置設置。我這樣加載:Guice,Settings和Boilerplate代碼
@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
}
這似乎並不能節省我太多!更糟的是,如果我爲每個設置參數創建一個自定義註釋類。有一個更好的方法,對吧?
一種解決方案可能是通過設置圍繞直接反對,但違反best practices: Inject only direct dependencies ......
設置*是*直接依賴。僅僅因爲你沒有調用Settings對象的每個方法並不意味着它不是一個直接的依賴關係。 – 2013-02-28 22:04:42
@JBNizet好吧,我確實有一個與設置對象相關的接口...現在它只是從平面文件中讀取數據,但我希望稍後將其作爲數據庫。但我想它會有相同的接口,無論哪種方式... – durron597 2013-02-28 22:14:23
因此,直接注入設置。爲了進行單元測試,你只需要注入一個模擬設置對象,並存儲被測對象使用的方法。經典的依賴注入。 – 2013-02-28 22:30:47