golang ioc容器

参考文档:
ioc-go
ali ioc-go

简单的demo

引用包

go get github.com/golobby/container/v3

import "github.com/golobby/container/v3"

demo

package main

import (
	"fmt"

	"github.com/golobby/container/v3"
)

type Shape interface {
	SetArea(int)
	GetArea() int
}

type Circle struct {
	a int
}

func (c *Circle) SetArea(a int) {
	c.a = a
}

func (c Circle) GetArea() int {
	return c.a
}

type Database interface {
	Connect() bool
}

var instance = container.New()

func main() {
	if err := instance.Singleton(func() Shape {
		return &Circle{a: 13}
	}); err != nil {
		fmt.Println(err)
		return
	}

	if err := instance.Call(func(s1 Shape) {
		s1.SetArea(666)
	}); err != nil {
		fmt.Println(err)
	}

	if err := instance.Call(func(s2 Shape) {
		if s2.GetArea() == 666 {
			fmt.Println("success")
		}
	}); err != nil {
		fmt.Println(err)
	}

}

可以通过通过函数、变量和结构解决。

代码取决于抽象程度

框架中简单的绑定

err := container.Singleton(func() Config {
    return &JsonConfig{...}
})

var c Config
err := container.Resolve(&c)

此ioc框架将抽象绑定到具体实现中。
绑定对象,是将抽象的实现引入ioc容器的过程。过程中可以确定解析类型、单例或者瞬态。

  • 单例绑定中:容器提供一次实例,并为所有请求返回实例。
  • 瞬态绑定中:容器总为每个请求返回一个全新的实例。
    绑定后就可以进行抽象的具体实现了,所以说代码取决于抽象而不是实现。

猜你喜欢

转载自blog.csdn.net/weixin_56766616/article/details/129955643