嵌套依赖注入在golang中是否可以接受?

时间:2018-11-30 16:56:49

标签: go dependency-injection

嵌套依赖项注入是否存在任何问题?例如:

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创建的所有数据类型也将能够使用依赖项。

2 个答案:

答案 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)
}