這裏的情況:我有一個抽象類具有構造函數的布爾(控制某些緩存行爲):注漿生成的類,而無需編寫過多的模塊配置代碼
abstract class BaseFoo { protected BaseFoo(boolean cache) {...} }
的實現都產生源代碼(其中許多是幾十個)。我想自動爲它們創建綁定,即沒有爲每種綁定類型明確的手工編碼。我希望注入站點能夠指定緩存或非緩存(true/false ctor參數)。比如我可能有兩次注射,如:
DependsOnSomeFoos(@Inject @NonCaching AFoo aFoo, @Inject @Caching BFoo bFoo) {...}
(可以說這是一個不好的事,既然決定緩存與否可能更是一個模塊中,但它給什麼我的工作似乎是有用的。 。)
接下來的問題是:什麼是配置綁定產生設置生成的類型的以統一的方式最好的方式,支持對具體類綁定註釋以及構造PARAM ?
以前我只是在實現類上有一個默認的構造函數,只是在每個生成的接口上放置@ImplementedBy。例如: -
// This is all generated source...
@ImplementedBy(AFooImpl.class)
interface AFoo { ... }
class AFooImpl extends BaseFoo implements AFoo { AFooImpl() { super(true); } }
但是,現在我想允許,如果真或假傳遞給BaseFoo單獨注入點來決定,而不是它總是默認設置爲true。我試圖建立一個注入監聽器(偷偷地)改變構造後的真/假值,但我無法看到如何「注視」注入某個註釋的類型的範圍。
我不斷回來的問題是綁定需要針對特定類型,但我不想枚舉所有類型的集中。
我也認爲:
- 編寫某種掃描器發現所有生成的類,並添加一對綁定的爲他們每個人,也許是使用谷歌的思考。
- 創建額外的,不重要的「非緩存」類型(例如AFoo.NoCache擴展AFoo),這將允許我回到@ImplementedBy。
- 將每種特定類型的硬接線在生成時配置爲緩存/非緩存。
我對任何這些想法都感覺不太好。有沒有更好的辦法?
更新:感謝您的評論和答覆。我認爲在每種類型的旁邊生成一個小模塊,並在運行時通過getResources
寫出一個模塊列表以獲得勝利。
這就是說,在與同事交談之後,我們可能只是在提出問題時躲開問題,而是用類似boolean shouldCache(Class<? extends BaseFoo> c)
的方法將策略對象注入到每個生成的類中。該策略可以在應用程序配置之上實現,並提供粗粒度和細粒度控制。這放棄了注射部位改變行爲的要求。另一方面,我們不需要額外的模塊。
經過推斷,我找不到任何方法來實現你想要的,除了你提出的解決方案。在這三種解決方案中,我認爲第二種解決方案並不錯:將它添加到代碼生成中並不難,它很容易使用(在您希望注入的方法中)並且可讀。如果有的話,我會非常有興趣看到另一個更適合Guice的解決方案。 – jfpoilpret 2011-04-19 09:16:58