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:#

Features:#

  • Support grpc connection timeout with context. (fix)

Dependency injection#

依赖注入是更广泛的控制反转技术的一种形式。它的作用是提高程序的模块化和可扩展性。

此次升级将DI独立,以便之后集成更多外围生态,开源地址: https://github.com/yoyofxteam/dependencyinjection

YoyoGO框架API实例#

Copy
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#

Copy
go get -u github.com/yoyofxteam/dependencyinjection@v1.0.0

服务提供者#

首先服务提供者都是以构造器的形式提供的,我们需要创建两个基本类型:http.server和http.ServeMux。让我们创建一个简单的构造函数来初始化它

Copy
// 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{} }

支持的构造器签名如下

Copy
func([dep1, dep2, depN]) (result, [cleanup, error])

构建一个DI容器#

Copy
import ( di "github.com/yoyofxteam/dependencyinjection" ) container := di.New( // provide http server di.Provide(NewServer), // provide http serve mux di.Provide(NewServeMux) )

获取容器中的实例#

Copy
// declare type variable var server *http.Server // extracting err := container.Extract(&server) if err != nil { // check extraction error } server.ListenAndServe()

注册Naming定义提供者#

Copy
// 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 来声明结构体,对其它提供者提供多依赖管理:

Copy
// 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()函数统一管理:

Copy
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 }
posted @   YOYOFx  阅读(448)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2016-07-15 .NET Core第三方开源Web框架YOYOFx
点击右上角即可分享
微信分享提示
CONTENTS