ZVVQ代理分享网

golang框架中不同依赖注入库的比较(golang库不是

作者:zvvq博客网
导读go框架中常用的依赖注入库包括:wire:轻量级,使用代码生成,简洁易用。dagger:复杂api,高级功能,如范围控制。constructor injection:构造函数注入,显式控制依赖。 Go框架中依赖注入

go架构常用的依赖注入库包含:wire:轻量,应用代码生成,简约实用。dagger:繁杂api,高级功能,如范畴操纵。constructor injection:对象引入,显式操纵依靠。

Go框架中依赖注入库的较为

依赖注入 (DI) 库使我们能够以可器重与可检测的形式创建对象和连接对象。在Go中,几个最流行的DI库,包含:

1.Wire

Wire是一个简易轻巧的库,应用代码生成去执行依赖注入。它提供了简约和高介入性的API,不需要在代码中使用任何注解。

import "github.com/google/wire"

func ProvideUserStore() UserStore { ... }

func ProvideUserService() UserService { ... }

func ProvideHttpHandler() HttpHandler { ... }

func InitializeApp() App {

wire.Build(

ProvideUserStore,

ProvideUserService,

ProvideHttpHandler,

wire.Bind(

new(UserServiceInterface),

new(UserService),

),

)

}

2.Dagger

Dagger是一个搭建于编译时注释解决的基础之上库。其具有繁杂的API,但提供了一些高级功能,比如范畴控制与可选择依存关系。

import (

"github.com/google/dagger/v2/core"

"github.com/google/dagger/v2/framework"

)

type UserStoreModule struct {

}

func (um UserStoreModule) Configure(b framework.Builder) {

b.Bind(new(UserStore)).To(new(MyUserStore))

}

func InitializeApp() App {

modules := []framework.Module{

new(UserStoreModule),

}

c := core.NewContainer()

if err := c.Populate(modules...); err != nil {

panic(err)

}

}

3.Constructor Injection

说白了,Constructor Injection库使用构造函数公式引入来处理依存关系。它提供了对依存关系的显式操纵,并且可以与其它技术性(如反射和代码生成)配合使用。

import (

"github.com/jmalloc/injection"

)

type UserStore interface {

Get(id int) User

}

type UserService struct {

store UserStore

}

func NewUserService(store UserStore) UserService {

return &UserService{store: store}

}

func InitializeApp() App {

c := injection.New()

c.Add(&injection.Service{

Type: (UserService)(nil),

Value: func() UserService {

store := &MyUserStore{}

return NewUserService(store)

},

})

}

实战案例 :完成一个简单的Web应用软件

假定我们应该建立一个简单的Web应用软件,并且使用UserStore获取客户数据信息并把它表明给消费者。我们可以用Wire来处理依存关系:

package main

import (

"fmt"

"net/http"

"github.com/google/wire"

)

type UserStore interface {

GetUser(id int) (User, error)

}

type UserService struct {

store UserStore

}

func (s UserService) GetUser(id int) (User, error) {

return s.store.GetUser(id)

}

type HttpHandler struct {

service UserService

}

func (h HttpHandler) ServeHTTP(w http.ResponseWriter, r http.Request) {

user, err := h.service.GetUser(1)

if err != nil {

http.Error(w, "Error getting user", http.StatusInternalServerError)

return

}

fmt.Fprintln(w, user.Name)

}

func main() {

wire.Build(

ProvideUserStore,

ProvideUserService,

ProvideHttpHandler,

)

}

我的分享能够帮助你对Go框架中不同类型的依赖注入库有一个更好的掌握。根据自己新项目具体要求和喜好,挑选最适合自己的库。

以上就是关于golang框架中不一样依赖注入库的较为的详细内容,大量欢迎关注其他类似文章!