[灵性编程]GO的依赖注入AND自动生成代码

依赖总结下先有的获取对象依赖方式比较原始的New,全局global保存基于反射读取对象的依赖,程序启动时由DI库实例化(代表作dig等)基于反射读取对象的依赖,编译前生成完整构建函数(代表作wire等)第一种:最方便,直接快捷,大量依赖时候,但是因为是手动的,容易出现实例顺序非预期,不方便自动测试,mock等。第二种:因为是启动时反射获取依赖的,需要定义额外的函数给DI系统解析,例如一个结构的注入必须要要额外的代码,非常麻烦,不建议使用//提供者err:=c.Provide(func(conn*sql.DB)(*UserGateway,*CommentGateway,error){//...})iferr!=nil{//...}//使用者err:=c.Invoke(func(l*log.Logger){//...})iferr!=nil{//...}第三种,同样是基于反射,所以依然需要一个额外函数(只有配置信息)提供反射信息,生成同名函数,便捷度基本和手动New一致,wire由Google开源funcInitializeNewGormProvider()*Gorm{wire

Golang依赖注入框架wire使用详解

wire是google开源的依赖注入框架。它利用代码生成技术在编译时完成依赖注入,相较于使用反射的框架,如Uber的 dig和Facebook的 inject,wire提供了更好的性能和易于理解的代码。使用wire,你只需定义injector函数,wire会自动根据函数签名生成注入逻辑。在wire中,provider和injector是核心概念。provider是普通的Go函数,用于生成值,这些函数描述了对象的依赖情况。injector是wire生成的函数,用于按依赖顺序调用provider,最终返回所需对象。要使用wire,首先定义provider函数,告诉wire对象如何产生。然后,编写injector函数的签名,wire据此自动生成注入逻辑。在main.go文件中,通过调用生成的injector函数即可获取所需的对象。使用wire时,会通过一个函数告知它如何生成injector。wire根据这个函数生成注入器的步骤:首先定义函数签名,然后调用wire

依赖注入不是Java的专利,Golang也有

在探索Golang编程过程中,作者发现构建依赖关系的过程繁琐,需要手动创建和连接许多对象。不禁设想,如果Golang也能拥有类似Java的依赖注入框架,将会极大简化开发。令人惊喜的是,Golang确实存在这样的解决方案,它来自知名的大厂Facebook团队的开源项目。没有依赖注入的Java代码需要在main方法中直接new对象并构建依赖树,构造器繁多,维护起来复杂。而使用Google的Guice框架,代码明显精简,通过@Singleton和@Inject注解标记单例和依赖注入,实现了对象的自动构建和初始化,极大地减少了代码量。Guice还需要定义Module来手动创建叶子节点,好比宇宙大爆炸,而依赖注入则负责简化中间节点的构建。对比到Golang,同样引入依赖注入后,无需手动new和构造,仅需在main方法中通过Provide方法和`inject:""`标记来设置依赖。虽然这个开源库功能相对有限,但其轻量级的500多行代码已经足够满足大部分需求

injector依赖注入库

Injector是一个强大的依赖注入库,它帮助你在Go语言中管理对象的依赖关系。通过将依赖对象(如结构体和切片等)及其对应的beanName添加到Container中,使用时可以通过beanName从Container中获取并注入到所需的对象上。库内特别针对golang自带json解析库的限制,采用偏移指针技术处理不可导出字段的值设置。库的开发进展如下:在2020年10月13日,基本数据类型和*struct的singleton模式已实现;同年11月10日,增强了通过指针设置struct field的能力,提高了效率。此外,还支持使用demofield进行依赖注入,包括导出和不可导出的字段。关于依赖注入的实现,库使用三级缓存策略:singletonBeans、earlySingletonBeans和singletonFactories,分别用于存储已初始化的对象、待注入的对象和工厂函数,以解决循环依赖问题