最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • golang框架中不同依赖注入库的比较

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

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

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

    依赖注入 (DI) 库使我们能够以可重用和可测试的方式实例化和连接对象。在Go中,有几个流行的DI库,包括:

    1. Wire

    立即学习go语言免费学习笔记(深入)”;

    Wire是一个简单轻量的库,使用代码生成来执行依赖注入。它提供了简洁和低侵入性的API,不需要在代码中添加任何注释。

    import "<a style='color:#f60; text-decoration:underline;' href="https://www.codesou.cn/" 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框架中不同的依赖注入库有一个更好的了解。根据你项目的具体要求和偏好,选择最适合你的库。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » golang框架中不同依赖注入库的比较
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 294稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情