yoyogo-diGo 語言依賴注入框架
Dependency injection 依賴注入是更廣泛的控制反轉(zhuǎn)技術(shù)的一種形式。它的作用是提高程序的模塊化和可擴(kuò)展性。
此次升級將 DI 獨(dú)立,以便之后集成更多外圍生態(tài),開源地址:https://github.com/yoyofxteam/dependencyinjection
它分為(高/低)層API接口,下面展示下高層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}
}
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
框架安裝
go get -u github.com/yoyofxteam/[email protected]
服務(wù)提供者
首先服務(wù)提供者都是以構(gòu)造器的形式提供的,我們需要?jiǎng)?chuàng)建兩個(gè)基本類型:http.server和http.ServeMux。讓我們創(chuàng)建一個(gè)簡單的構(gòu)造函數(shù)來初始化它
// 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{}
}
支持的構(gòu)造器簽名如下
func([dep1, dep2, depN]) (result, [cleanup, error])
構(gòu)建一個(gè)DI容器
import (
di "github.com/yoyofxteam/dependencyinjection"
)
container := di.New( // provide http server
di.Provide(NewServer), // provide http serve mux
di.Provide(NewServeMux)
)
獲取容器中的實(shí)例
// 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
依賴關(guān)聯(lián)
可能實(shí)際的情況,類型間會有大量依賴,組件A依賴組件B,這種情況我們使用 di.Parameter 來聲明結(jié)構(gòu)體,對其它提供者提供多依賴管理:
// ServiceParameters
type ServiceParameters struct {
di.Parameter
MasterDatabase *Database `di:"master"`
SlaveDatabase *Database `di:"slave,optional"` // optional 可選參數(shù),如果沒有實(shí)例則為nil}// NewService creates new service with provided parameters.func NewService(parameters ServiceParameters) *Service { return &Service{
MasterDatabase: parameters.MasterDatabase,
SlaveDatabase: parameters.SlaveDatabase,
}
}
Cleanup函數(shù)
提供者構(gòu)造器返回清理函數(shù)用于銷毀實(shí)例和釋放資源,它由容器的container.Cleanup()函數(shù)統(tǒng)一管理:
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
}
此項(xiàng)目已集成到 yoyogo框架中:
gitee: https://gitee.com/yoyofx/yoyogo github: https://github.com/yoyofx/yoyogo
???? YoyoGo 一個(gè)簡單、輕量、快速、基于依賴注入的微服務(wù)框架( web 、grpc、xxl-job、console ),支持的注冊中心 Nacos/Consoul/Etcd/Eureka/k8s 等。
評論
圖片
表情
