嵌套依赖项注入是否存在任何问题?例如:
type ParentService struct{
db *sql.DB
}
type UsefulChildStruct struct{
attrA int
attrB int
db *sql.Db
}
func NewParent(db *sql.DB) *ParentService{
return &ParentService{db: db}
}
func (p *ParentService) NewChild() *UsefulChildStruct{
return &UsefulChildStruct{db: p.db}
}
func (c *UsefulChildStruct) DoSomething(){
x := c.db.SomeQuery
}
func (c *UsefulChildStruct) DoAnotherThing(){
x := c.db.SomeQuery
}
func main(){
db := getDB()
parent := NewParent(db)
child := parent.NewChild(parent.db)
}
基本原理是,由ParentService创建的所有数据类型也将能够使用依赖项。
答案 0 :(得分:0)
这样做没有问题。但是除了复杂性之外,您没有创造任何价值!
另一个问题是您自己受限制,如果以后想对有用的孩子结构使用differnetdb,则必须更改代码。这违反了开放扩展为修改原则
答案 1 :(得分:0)
我认为您应该这样做,但是我不确定语法。
package main
type Storage interface {
Get() (*Items, err)
}
type Items struct {
foo string
}
// Postgres database
type postgres struct {
db *sql.DB
}
func newPostgres(db *sql.DB) *postgres {
return &postgres{db}
}
func (p *postgres) Get() (*items, error){
// query something here
return nil, nil
}
// Mongo database
type mongodb struct {
mongo *session // i'am not sure about this
}
func newMongo (session) *mongdb {
return &mongdb{mongo: session}
}
func (m *mongdob) Get() (*items, error) {
// query something here
return nil, nil
}
// mock database
type mockDB struct {}
func newMock () mockDB {
return mockDB{}
}
func (m mockDB) Get() (*items, error) {
// query something here
return nil, nil
}
type ParentService struct{
db Storage
}
func NewParent(db Storage) *ParentService{
return &ParentService{db: db}
}
func (p *ParentService) doSomething() {
items, err := p.db.Get()
// do something with items
}
func main(){
db := connectPostgres()
pStorage := newPostgres(db)
parent := NewParent(pStorage)
sess := connectMongo()
mStorage := newMongo(sess)
parent := NewParent(mStorage)
mockStorage := mockDB()
parent := NewParent(mockStorage)
}