go框架中常用的依赖注入库包括:wire:轻量级,使用代码生成,简洁易用。dagger:复杂api,高级功能,如范围控制。constructor injection:构造函数注入,显式控制依赖。
Go框架中依赖注入库的比较
依赖注入 (DI) 库使我们能够以可重用和可测试的方式实例化和连接对象。在Go中,有几个流行的DI库,包括:
1. Wire
立即学习“go语言免费学习笔记(深入)”;
Wire是一个简单轻量的库,使用代码生成来执行依赖注入。它提供了简洁和低侵入性的API,不需要在代码中添加任何注释。
import "<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/15841.html" target="_blank">git</a>hub.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框架中不同的依赖注入库有一个更好的了解。根据你项目的具体要求和偏好,选择最适合你的库。