Facebook 在 Golang 依赖注入的博雅棋牌官网实现
更新时间: Feb 27, 2021  作者:刘  来源:

依赖注入是一个经典的设计模式,在解决复杂的对象依赖关系方面是一个非常行之有效的手段。

对于有反射功能的语言来说,实现依赖注入都比较方便一些。在 Golang 中有几个比较知名的依赖注入开源库,例如 google/wireuber-go/dig 以及 facebookgo/inject 等。

本文将基于 facebookgo/inject 介绍依赖注入, 接下来将会着重讨论以下几点内容:

依赖注入的背景以及解决的问题facebookgo/inject 的使用方法facebookgo/inject 的缺陷依赖注入的背景

对于稍微复杂些的项目,我们往往就会遇到对象之间复杂的依赖关系。手动管理和初始化这些管理关系将会极其繁琐,依赖注入可以帮我们自动实现依赖的管理和对象属性的赋值,将我们从这些繁琐的依赖管理中解放出来。

以一个常见的 HTTP 服务为例,我们在开发后台时往往会把代码分为 Controller、Service 等层次。如下:

type UserController struct { UserService *UserService Conf *Conf } type PostController struct { UserService *UserService PostService *PostService Conf *Conf } type UserService struct { Db *DB Conf *Conf } type PostService struct { Db *DB } type Server struct { UserApi *UserController PostApi *PostController }

上述的代码例子中,有两个 Controller:UserController 和 PostController,分别用来接收用户和文章的相关请求逻辑。除此之外还会有 Service 相关类、Conf 配置文件、DB 连接等。

这些对象之间存在比较复杂的依赖关系,这就给项目的初始化带来了一些困扰。对于以上代码,对应初始化逻辑大概就会是这样:

func main() { conf := loadConf() db := connectDB() userService := &UserService{ Db: db, Conf: conf, } postService := &PostService{ Db: db, } userHandler := &UserController{ UserService: userService, Conf: conf, } postHandler := &PostController{ UserService: userService, PostService: postService, Conf: conf, } server := &Server{ UserApi: userHandler, PostApi: postHandler, } server.Run() }

我们会有一大段的逻辑都是用来做对象初始化,而当接口越来越多的时候,整个初始化过程就会异常的冗长和复杂。

针对以上问题,依赖注入可以完美的解决。

facebookgo/inject 的使用

接下来,我们试着使用 facebookgo/inject 的方式,对这段代码进行依赖注入的改造。如下:

type UserController struct { UserService *UserService `inject:""` Conf *Conf `inject:""` } type PostController struct { UserService *UserService `inject:""` PostService *PostService `inject:""` Conf *Conf `inject:""` } type UserService struct { Db *DB `inject:""` Conf *Conf `inject:""` } type PostService struct { Db *DB `inject:""` } type Server struct { UserApi *UserController `inject:""` PostApi *PostController `inject:""` } func main() { conf := loadConf() // *Conf db := connectDB() // *DB server := Server{} graph := inject.Graph{} if err := graph.Provide( &inject.Object{ Value: &server, }, &inject.Object{ Value: conf, }, &inject.Object{ Value: db, }, ); err != nil { panic(err) } if err := graph.Populate(); err != nil { panic(err) } server.Run() }

(责任编辑:博雅棋牌app)

本文地址:/waiyu/20210227/15260.html

上一篇:第二季度归属于普通股股东的净利润为164亿元,去年同期为6亿元

下一篇:全球只有三个国家没有美国大兵,不是美国不想,而是真不敢

惠州2人网帖举报区委书记有多处豪宅 被控寻衅滋事

魏云新对于转账给他人等事实表示认罪,李红安则辩博雅棋牌游戏称发布网帖实际是一种网络举报行为,二人及二人的辩护人均对惠城区检察院公诉人起诉二人犯寻衅滋事罪表示不服。 ...详情

“印度姚明”将签约国王 NBA重点开拓印度市场

据ESPN报道,国王将以10天短合同签下身高达到2米26、有“印度姚明”之称的西姆·布拉尔。  去年,布拉尔参加了NBA选秀大会,可惜名落孙山,之后国王与他签署了训练营合同,可惜, ...详情

哈登得51分创个人生涯新高 美中不足有7次失误

坐镇主场的火箭队迎来了国王队的挑战。本场比赛火箭队多次打出得分高潮,一度建立起两位数的领先优势,但顽强的国王队在考辛斯的带领下屡次将分差缩小,不过“联盟第一分卫” ...详情

北京:甲壳虫最高优惠3.08万元 置换另享补贴

笔者走访了北京地区进口大众4S店了解到,店内大众甲壳虫少量现车在售,颜色方面不是很全。售价方面,时下购车最高优惠3.08万元,置换另享补贴。感兴趣的朋友可以到店赏车试驾。 ...详情

大连大黑山森林火灾系中小学生玩火引发

大连市相关部门组成的专案组30日发布了这博雅棋牌游戏一消息。  3月22日13时48分,大连金州新区森林消防指挥中心接到报警,大连金州新区大黑山南侧发生火灾。森林消防迅速前往 ...详情

成都遭遇今春最博雅棋牌官网猛倒春寒 6天内降13.8℃

成都春熙路上的妹子被大风吹得披头散发!吴小川摄4月成都每日最高温制图姚海涛  来成都吧,一分钟可以换三种发型;来成都吧,一星期可以体验三种季节。日最高温从30℃到16.2℃ ...详情

曝李敏镐一直视秀智为女神 靠甜蜜举动抱得佳人

韩国男星李敏镐身形高挑、五官深邃,是许多女人心中的白马王子,他与“国民初恋”秀智恋情曝光,让许多粉丝心碎。近日,有节目爆料虽然李敏镐差女方的理想型男生很多,但李敏 ...详情

安徽黄山市政府招商被骗 为填补窟窿倒贴3500万

安徽省纪委监察厅网站挂出一则消息称,黄山市政府副秘书长于亮涉嫌严重违纪正接受组织调查。而他的落马也将一桩当地博雅棋牌官网招商引资被骗的旧事牵出。  2021年1月,于 ...详情