首页 > 后端开发 > Golang > 正文

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

PHPz
发布: 2024-07-13 21:33:02
原创
689人浏览过

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

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

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

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

1. Wire

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

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

Ideogram
Ideogram

Ideogram是一个全新的文本转图像AI绘画生成平台,擅长于生成带有文本的图像,如LOGO上的字母、数字等。

Ideogram 512
查看详情 Ideogram

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框架中不同依赖注入库的比较的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号