我最近一直在做Go項目。為了允許每個組件都是可單元測試的,我一直在遵循幾篇文章中指定的模式來更改函數,例如:func WriteObject(obj ObjType) { dbClient := DBClient{} dbClient.WriteObject(obj)} 就像:type WriteObject interface { WriteObject(obj ObjType)}type ProxyWriteObject struct { dbClient DBClientInterface}func (p * ProxyWriteObject) WriteObject(obj ObjType) { p.dbClient.WriteObject(obj)}這樣我就可以在測試期間模擬dbClient。我的問題是,如果我使用這種方法,我將有一堆組件都依賴于接口。實現這些接口的對象的實例應該在哪里構造?最明顯的事情似乎是讓不受任何其他依賴的頂級對象構建其依賴項以及所有依賴項的依賴項等,但這將非?;靵y。我主要使用Java,所以通常我會使用Dagger/Guice/Spring來構建和注入對象。Go 中是否有類似或推薦的 DI 框架,或者構建這些對象的推薦方法是什么?
1 回答

慕虎7371278
TA貢獻1802條經驗 獲得超4個贊
一個簡單的解決方案是:
type DBClientIntf interface {
WriteObject(ObjType)
}
func WriteObject(obj ObjType,cli DBClientIntf) {
cli.writeObject(obj)
}
或者,您可以擁有一家工廠:
func WriteObject(obj ObjType,cli func() DBClientIntf) {
cli().writeObject(obj)
}
或者,全球工廠:
var getDBClient=func() DBClientIntf {
return DBClient{}
}
func WriteObject(obj ObjType) {
getDBClient().writeObject(obj)
}
并將全局工廠設置為返回模擬客戶端的函數:
func TestWriteObject(t *testing.T) {
getDBClient=func() DBClient {
return mockDBClient{}
}
...
}
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消