golang依赖注入工具

digo工具地址:https://github.com/werbenhu/digo

特性

  • 使用注释中的注解
  • 自动代码生成
  • 自动检测循环依赖
  • 编译时期依赖注入
  • 自动初始化
  • 支持实例组的管理

快速开始

更多示例请参考:examples

编写代码和注解

package main

import (
"log" "github.com/werbenhu/digo"
) // @provider({"id":"main.db.url"})
func NewDbUrl() string {
return "localhost:3306"
} type Db struct {
url string
} // @provider({"id":"main.db"})
// @inject({"param":"url", "id":"main.db.url"})
func NewDb(url string) *Db {
return &Db{
url: url,
}
} type App struct {
Db *Db
} // @provider({"id":"main.app"})
// @inject({"param":"db", "id":"main.db"})
func NewApp(db *Db) *App {
return &App{
Db: db,
}
} func (a *App) Start() {
log.Printf("app strat, db:%s\n", a.Db.url)
} func main() {
app, err := digo.Provide("main.app")
if err == nil {
app.(*App).Start()
}
}

安装digogen工具

go install github.com/werbenhu/digo/digogen@v1.0.0

生成依赖注入代码

打开命令行执行下面命令,digogen将会根据注解自动生成digo.generated.go源码文件.

digogen

运行代码

go run .\digo.generated.go .\main.go

注解详情

@provider

@provider注解表示是一个实例提供者,该实例是一个单例

  • 示例
// @provider({"id":"main.db"})
  • 支持的参数:
参数 类型 是否必需 说明
id string 实例的id

如果获取实例,通过digo.Provide(providerId)可以获取到某一个provider的实例

app, err := digo.Provide("main.app")
if err == nil {
app.(*App).Start()
}

@inject

@inject注解表示注入一个实例到某个参数, @inject注解必须和@provider或者@group二者中的一个同时存在.

  • 示例
// @inject({"param":"db", "id":"main.db"})
  • 支持的参数:
参数 类型 是否必需 说明
param string 指明哪个参数需要注入实例
id string 指明需要注入的实例id
pkg string 该参数需要引入特定的包

pkg在什么时候需要使用,比如我们需要引入一个包 github.com/xxx/tool/v1 , 我们使用包名的时候是这样使用的 *tool.Struct, 而不是 *v1.Struct,那我们需要显示指明需要导入github.com/xxx/tool/v1

// @inject({"param":"tool", "id":"main.tool", "pkg":"github.com/xxx/tool/v1"})

@group

@group注解表示将实例注册到一个组

  • 示例
// @group({"id":"main.controllers"})
  • 支持的参数:
参数 类型 是否必需 说明
id string 组的id

如果获取组的所有实例,通过digo.Members(groupId)可以获取到组的所有实例

ctrls, err := digo.Members("main.controllers")
if err == nil {
for _, controller := range ctrls {
// TODO:
}
}

golang依赖注入工具digo的更多相关文章

  1. Golang依赖管理工具: go module 详解

    Golang依赖管理工具: go module (go1.11+) 大多数语言都会有包管理工具,像Node有npm,PHP有composer,Java有Maven和Gradle. 可是,Go语言一直缺 ...

  2. Golang依赖管理工具:glide从入门到精通使用

    这是一个创建于 2017-07-22 05:33:09 的文章,其中的信息可能已经有所发展或是发生改变. 介绍 不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题.Java有牛逼轰轰 ...

  3. 【ASP.NET MVC 学习笔记】- 05 依赖注入工具Ninject

    本文参考:http://www.cnblogs.com/willick/p/3223042.html 1.Ninject是一款轻量级的DI工具,可通过VS的插件NuGet将其引用到项目中. 2.使用N ...

  4. Compile-time Dependency Injection With Go Cloud's Wire 编译时依赖注入 运行时依赖注入

    Compile-time Dependency Injection With Go Cloud's Wire - The Go Blog https://blog.golang.org/wire Co ...

  5. golang常用库包:Go依赖注入(DI)工具-wire使用

    google 出品的依赖注入库 wire:https://github.com/google/wire 什么是依赖注入 依赖注入 ,英文全名是 dependency injection,简写为 DI. ...

  6. <Pro .NET MVC4> 三大工具之依赖注入神器——Ninject

    这篇内容是对<Pro .NET MVC4>一书中关于Ninject介绍的总结. Ninject是.NET MVC的一款开源的依赖注入工具. 使用场景:当MVC项目中使用了依赖注入技术来给程 ...

  7. Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  8. .Net Core中依赖注入服务使用总结

    一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...

  9. 谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问

    1. 背景 依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论: 你这个DI工具的出发点可能有问题,一个MVC工具为什 ...

  10. Go工程化 - 依赖注入

    我们在微服务框架kratos v2的默认项目模板中kratos-layout使用了google/wire进行依赖注入,也建议开发者在维护项目时使用该工具. wire 乍看起来比较违反直觉,导致很多同学 ...

随机推荐

  1. Redis-Cluster常用命令

    CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息. //节点 CLUSTER MEET <ip> < ...

  2. Docke的使用与详解2 --RabbitMQ安装与使用

    一.RabbitMQ安装与使用 1.RabbitMQ安装 --RabbbitMQ官网 1>使用docker pull rabbitmq拉取镜像,默认拉取最新版本: 这时你会想,我要拉取指定版本该 ...

  3. flutter widget---->FloatingActionButton

    在Flutter中说起Button,floatingActionButton用的也非常的多.今天我们就来学习一下. Simple Example import 'package:flutter/mat ...

  4. 简单入门echart方法

    图表用echart, 然后前端的 HTML 跟 nodejs  , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ...

  5. 构建基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统(Python3.10/Tensorflow2.11)

    毋庸讳言,和传统架构(BS开发/CS开发)相比,人工智能技术确实有一定的基础门槛,它注定不是大众化,普适化的东西.但也不能否认,人工智能技术也具备像传统架构一样"套路化"的流程,也 ...

  6. 什么?又来智能AI编程?让不让我们活了!

    无事逛github发现了一款智能AI编程,故下载试试 发现异常好用 推荐给大家 github地址:GitHub - getcursor/cursor:一个用于使用AI 编程的编辑器 支持:C# ,Ja ...

  7. nginx重启和操作

    在linux操作系统中,重启nginx 1.当不知道nginx所在目录时,需要先查找到nginx的位置  查看ngnix位置(master process 后面的就是 nginx的目录): ps -e ...

  8. 二进制安装Kubernetes(k8s) v1.23.3

    声明:微信公众号不支持富文本格式,代码缩进有问题 参考我其他平台文档: https://www.oiox.cn/index.php/archives/90/ https://juejin.cn/pos ...

  9. 《花雕学AI》13:早出对策,积极应对ChatGPT带来的一系列风险和挑战

    ChatGPT是一款能和人类聊天的机器人,它可以学习和理解人类语言,也可以帮人们做一些工作,比如翻译.写文章.写代码等.ChatGPT很强大,让很多人感兴趣,也让很多人担心. 使用ChatGPT有一些 ...

  10. XXL-JOB定时任务框架(Oracle定制版)

    特点 xxl-job是一个轻量级.易扩展的分布式任务调度平台,能够快速开发和简单学习.开放源代码并被多家公司线上产品使用,开箱即用.尽管其确实非常好用,但我在工作中使用的是Oracle数据库,因为xx ...