为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中实现依赖注入

如何在 Go 中实现依赖注入

Go
30秒到达战场 2022-01-04 15:52:11
我正在将一个应用程序从Play(Scala)移植到Go并想知道如何实现依赖注入。在 Scala 中,我使用了 cake 模式,而在 Scala 中,Go我实现了一个DAO接口以及一个 Mongo 的实现。下面是我如何尝试实现一个模式,让我DAO根据需要更改实现(例如测试、不同的数据库等):1. entity.gopackage modelsimport (    "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. 用户.gopackage modelsimport (    "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.gopackage persistencetype (    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方法Insert和Update编译器强制我将输入强制entity转换为特定类型 ( *models.User) 方面存在问题,但这使我无法拥有DAO适用于所有类型的通用组件。我该如何解决这个问题?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

创建一个为实体结构实现的接口怎么样?


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风格和清晰一旦你上的图案来使用结算。


查看完整回答
反对 回复 2022-01-04
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

这种概括


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


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信