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框架中不一样依赖注入库的较为的详细内容,大量欢迎关注其他类似文章!