Skip to content
cheivin edited this page Dec 29, 2021 · 6 revisions

概述

DI是一个简易版本的Go依赖注入实现。

文档地址

特性

  • 支持手动注册bean实例
  • 支持注册bean类型原型,由DI容器自动实例化并托管bean实例
  • 支持根据名称、类型获取DI容器托管的bean实例
  • 支持根据类型手动生成新的bean实例并返回
  • 支持配置项注入并转换成对应的基本类型
  • 支持匿名字段的bean注入

快速入门

要求

  • Go 1.13及以上版本

安装

  • 下载并安装DI:
go get -u github.com/cheivin/di
  • 将DI引入代码中
import "github.com/cheivin/di"

开始

接下来,假设你有ServiceDao两个类,且Service依赖Dao

// definition.go
package main

type (
	Dao struct {
		Prefix string `value:"db.prefix"`
	}
	Service struct {
		Dao *Dao `aware:""`
	}
)

func (s Service) GetPrefix() string {
	return s.Dao.Prefix
}

在项目中配置并使用

// main.go
package main

import (
	"fmt"
	"github.com/cheivin/di"
)

func main() {
	di.SetProperty("db.prefix", "demo").
		Provide(Dao{}).
		Provide(Service{}).
		Load()
	bean, ok := di.GetByType(Service{})
	if !ok {
		panic("service 不存在")
	}
	service := bean.(*Service)
	fmt.Println("输出", service.GetPrefix())
}

然后运行代码,控制台会输出如下内容并退出:

[DI-INFO] : provide bean with name: dao
[DI-INFO] : provide bean with name: service
[DI-INFO] : wire value for bean dao(main.Dao)
[DI-INFO] : initialize bean dao(*main.Dao)
[DI-INFO] : initialize bean service(*main.Service)
[DI-INFO] : wire field for bean service(main.Service)
输出 demo

如需要使用context控制容器退出,则请使用 Serve 。以监听终端信号为例,修改后如下:

// main.go
package main

import (
	"context"
	"fmt"
	"github.com/cheivin/di"
	"os/signal"
	"syscall"
)

func main() {
	di.SetProperty("db.prefix", "demo").
		Provide(Dao{}).
		Provide(Service{}).
		Load()
	bean, ok := di.GetByType(Service{})
	if !ok {
		panic("service 不存在")
	}
	service := bean.(*Service)
	fmt.Println("输出", service.GetPrefix())

	// 退出信号
	ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
	defer stop()
	di.Serve(ctx)
}
Clone this wiki locally