猿问

如何在 Go 中实现依赖注入

我正在将一个应用程序从Play(Scala)移植到Go并想知道如何实现依赖注入。在 Scala 中,我使用了 cake 模式,而在 Scala 中,Go我实现了一个DAO接口以及一个 Mongo 的实现。


下面是我如何尝试实现一个模式,让我DAO根据需要更改实现(例如测试、不同的数据库等):


1. entity.go


package models


import (

    "time"

    "gopkg.in/mgo.v2/bson"

)


type (

    Entity struct {

        Id        bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`

        CreatedAt time.Time     `json:"createdAt,omitempty" bson:"createdAt,omitempty"`

        LastUpdate time.Time    `json:"lastUpdate,omitempty" bson:"lastUpdate,omitempty"`

    }

)

2. 用户.go


package models


import (

    "time"

)


type (

    User struct {

        Entity                  `bson:",inline"`

        Name      string        `json:"name,omitempty" bson:"name,omitempty"`

        BirthDate time.Time     `json:"birthDate,omitempty" bson:"birthDate,omitempty"`

    }

)

3. dao.go


package persistence


type (

    DAO interface {

        Insert(entity interface{}) error

        List(result interface{}, sort string) error

        Find(id string, result interface{}) error

        Update(id string, update interface{}) error

        Remove(id string) error

        Close()

    }


    daoFactory func() DAO

)


var (

    New daoFactory

)

上面的代码是 90% 的好......我只是在mongoDao.go方法InsertUpdate编译器强制我将输入强制entity转换为特定类型 ( *models.User) 方面存在问题,但这使我无法拥有DAO适用于所有类型的通用组件。我该如何解决这个问题?


30秒到达战场
浏览 198回答 2
2回答

德玛西亚99

创建一个为实体结构实现的接口怎么样?type Entitier interface {    GetEntity() *Entity}该实现将简单地返回一个指向自身的指针,您现在可以在DAO的Insert和Update方法中使用该指针。这还有一个额外的好处,就是让您在 DAO 方法的声明中更加具体。与其简单地说明他们采用任意interface{}参数作为参数,您现在可以说他们采用Entitier.像这样:func (dao *mongoDAO) Update(id string, update Entitier) error这是我的意思的最小完整示例:http://play.golang.org/p/lpVs_61mfM希望这能给你一些想法!您可能要调整的命名Entity/ Entitier/GetEntity风格和清晰一旦你上的图案来使用结算。

一只甜甜圈

这种概括DAO interface {    Insert(entity interface{}) error看起来很霸道 你们都*models.User为 mongo断言doc := entity.(*models.User)并做user := &models.User{}userController.dao.Insert(user)使用通用 DAO 接口时。为什么不更精确地定义接口?DAO interface {    Insert(entity *models.User) error
随时随地看视频慕课网APP

相关分类

Go
我要回答