Являются ли вложенные инъекции зависимости приемлемой практикой в ​​Голанге? - PullRequest
0 голосов
/ 30 ноября 2018

Есть ли проблемы с вложенным внедрением зависимостей?Например:

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 голосов
/ 29 января 2019

Я думаю, вы должны сделать что-то подобное, но я не уверен в синтаксисе.

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)
}
0 голосов
/ 30 ноября 2018

В этом нет никаких проблем. Но вы не создали никакого значения, кроме сложности!

Другая проблема заключается в том, что вы ограничили себя, если вы хотите позже использовать difnet db для UsefulChildStruct, вам нужно изменитьваш код.Это нарушение открытого для расширения закрытого для принципа модификации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...