yoyogo v1.7.5 发布, 独立依赖注入DI
YoyoGo v1.7.5 🦄🌈 YoyoGo (Go语言框架)
一个简单、轻量、快速、基于依赖注入的微服务框架( web 、grpc ),支持Nacos/Consoul/Etcd/Eureka/k8s /Apollo等 .
https://github.com/yoyofx/yoyogo
v1.7.5 更新内容
Framework dependency:
- New dependency injection framework
https://github.com/yoyofxteam/dependencyinjection
Features:
- Support grpc connection timeout with context. (fix)
Dependency injection
依赖注入是更广泛的控制反转技术的一种形式。它的作用是提高程序的模块化和可扩展性。
此次升级将DI独立,以便之后集成更多外围生态,开源地址: https://github.com/yoyofxteam/dependencyinjection
YoyoGO框架API实例
type A struct {
Name string
}
func NewA() *A {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
name := "A-" + strconv.Itoa(r.Int())
return &A{Name: ls}
}
// 高层API , 用于IOC声明,不做DI容器表达。 支持三种生命周期如下:
// Singleton ServiceLifetime = 0
// Scoped ServiceLifetime = 1
// Transient ServiceLifetime = 2
services := NewServiceCollection()
services.AddSingleton(NewA)
//serviceCollection.AddSingletonByImplementsAndName("redis-master", NewRedis, new(abstractions.IDataSource))
//serviceCollection.AddTransientByImplements(NewRedisClient, new(redis.IClient))
//serviceCollection.AddTransientByImplements(NewRedisHealthIndicator, new(health.Indicator))
serviceProvider := services.Build()
var env *A
_ = serviceProvider.GetService(&env) // used
Installing
go get -u github.com/yoyofxteam/dependencyinjection@v1.0.0
服务提供者
首先服务提供者都是以构造器的形式提供的,我们需要创建两个基本类型:http.server和http.ServeMux。让我们创建一个简单的构造函数来初始化它
// NewServer creates a http server with provided mux as handler.
func NewServer(mux *http.ServeMux) *http.Server {
return &http.Server{
Handler: mux,
}
}
// NewServeMux creates a new http serve mux.
func NewServeMux() *http.ServeMux {
return &http.ServeMux{}
}
支持的构造器签名如下
func([dep1, dep2, depN]) (result, [cleanup, error])
构建一个DI容器
import (
di "github.com/yoyofxteam/dependencyinjection"
)
container := di.New(
// provide http server
di.Provide(NewServer),
// provide http serve mux
di.Provide(NewServeMux)
)
获取容器中的实例
// declare type variable
var server *http.Server
// extracting
err := container.Extract(&server)
if err != nil {
// check extraction error
}
server.ListenAndServe()
注册Naming定义提供者
// MasterDatabase provide write database access.
type MasterDatabase struct {
*Database
}
// SlaveDatabase provide read database access.
type SlaveDatabase struct {
*Database
}
// 省略
// provide master database
di.Provide(NewMasterDatabase, di.WithName("master"))
// provide slave database
di.Provide(NewSlaveDatabase, di.WithName("slave"))
var database *Database
err := container.Extract(&database,di.Name(master)) // get master databse
依赖关联
可能实际的情况,类型间会有大量依赖,组件A依赖组件B,这种情况我们使用 di.Parameter 来声明结构体,对其它提供者提供多依赖管理:
// ServiceParameters
type ServiceParameters struct {
di.Parameter
MasterDatabase *Database `di:"master"`
SlaveDatabase *Database `di:"slave,optional"` // optional 可选参数,如果没有实例则为nil
}
// NewService creates new service with provided parameters.
func NewService(parameters ServiceParameters) *Service {
return &Service{
MasterDatabase: parameters.MasterDatabase,
SlaveDatabase: parameters.SlaveDatabase,
}
}
Cleanup函数
提供者构造器返回清理函数用于销毁实例和释放资源,它由容器的container.Cleanup()函数统一管理:
func NewFile(log Logger, path Path) (*os.File, func(), error) {
f, err := os.Open(string(path))
if err != nil {
return nil, nil, err
}
cleanup := func() {
if err := f.Close(); err != nil {
log.Log(err)
}
}
return f, cleanup, nil
}
作者: YOYOFx
出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。