在Golang中使用依赖注入 全球视点
在Go语言中,依赖注入(Dependency Injection,DI)是一个非常流行的概念。Go语言自身并没有提供官方的DI框架,但是社区中有很多第三方库可以实现依赖注入。
以下是一些比较流行的依赖注入框架和库:
(资料图片)
1、Uber的dig
dig是Uber开发的一个依赖注入库,它提供了良好的性能和可读性。dig支持构造函数注入、函数参数注入和结构体字段注入。dig还提供了一个可视化工具,可以方便地查看DI图。
下面是一个使用Uber的dig库实现依赖注入的例子:
假设我们有一个服务(Service)需要依赖另外两个服务(Database、Cache):
在没有依赖注入的情况下,我们需要手动创建依赖:
但是,使用dig库可以简化依赖注入过程。我们可以通过dig.Container来管理依赖:
在这个例子中,我们通过dig.Container的Provide方法注册了三个依赖关系。在获取Service实例时,我们通过Invoke方法将Service实例注入到函数参数中。如果依赖关系中有循环依赖,则dig会在运行时抛出错误。
总的来说,使用dig库可以大大简化依赖注入的过程,并且可以在编译时检查依赖关系的正确性。
2、Google的wire
wire是Google开发的一个依赖注入框架,它可以生成代码,以减少手写代码的工作量。wire支持从结构体中自动推导出依赖关系,并且可以通过命令行工具轻松生成DI代码。wire还提供了可插拔的插件系统,可以实现自定义的代码生成策略。
下面是一个使用Google的Wire库实现依赖注入的例子:
假设我们有一个服务(Service)需要依赖另外两个服务(Database、Cache):
在没有依赖注入的情况下,我们需要手动创建依赖:
但是,使用Wire库可以自动生成依赖注入代码。我们可以在wire文件中声明依赖关系:
在这个文件中,我们定义了三个函数,分别用于创建Database、Cache和Service实例。我们还定义了一个InitializeService函数,它使用wire.Build函数来自动构建Service实例。
在项目代码中,我们可以直接调用InitializeService函数来获取Service实例:
在运行wire.Build函数时,Wire会自动查找InitializeService函数中使用到的依赖,并自动生成依赖注入代码。在这个过程中,Wire会检查依赖关系的正确性,并在发现错误时返回错误信息。
3、Facebook的inject
inject是Facebook开发的一个轻量级依赖注入库,它支持构造函数注入和结构体字段注入。inject的特点是代码量小,使用简单,但是在性能和可读性方面可能不如dig和wire。
假设我们有一个服务(Service)需要依赖另外两个服务(Database、Cache):
在没有依赖注入的情况下,我们需要手动创建依赖:
但是,使用inject库可以简化依赖注入过程。我们可以通过inject库的Init函数来自动注入依赖:
在这个例子中,我们使用inject库的Map方法将Database、Cache和Service实例注册为依赖关系。然后,我们通过Apply方法自动将依赖注入到Service实例中。在注入过程中,inject库会自动识别依赖关系,并进行依赖注入。
总的来说,使用inject库可以大大简化依赖注入的过程,并且可以自动识别依赖关系进行依赖注入。但是,使用inject库可能需要一定的学习成本,并且inject库目前已经停止更新和维护,可能不适合用于新的项目中。
4、GoCloud的Wire
Wire是GoCloud团队开发的一款依赖注入库,它基于Wire代码生成工具,可以自动将结构体中的依赖注入到字段中。它支持命名依赖注入、参数化依赖注入和绑定。另外,Wire还支持生成依赖注入的文档,可以方便地了解代码的依赖关系。
下面是一个使用GoCloud的Wire库实现依赖注入的例子:
假设我们有一个服务(Service)需要依赖另外两个服务(Database、Cache):
使用Wire库可以通过Wire生成依赖注入代码。
在Wire库中,我们需要定义一个wire.go文件,它包含了需要注入的结构体和对应的Provider函数:
然后,在main函数中使用Wire的Build函数来注入依赖关系:
在这个例子中,我们使用Wire库的Build函数自动识别依赖关系,并注入到InitializeService函数中,然后在main函数中使用InitializeService函数来获取Service实例,并使用它的Get方法。
总的来说,使用Wire库可以简化依赖注入的过程,并且可以自动识别依赖关系进行依赖注入。但是,使用Wire库可能需要一定的学习成本,并且需要定义额外的wire.go文件,可能会增加一定的复杂度。不过,Wire库是一个非常流行和活跃的库,可以在大多数情况下满足依赖注入的需求。
总之,在Go语言中,DI并不是必需的,因为Go语言的组合和接口特性可以很好地解决依赖注入的问题。但是,对于大型复杂的项目来说,使用DI框架可以提高代码的可测试性和可维护性。选择哪个DI框架或库取决于项目的需求和个人偏好。
原文链接:https://duoke360.com/post/5771
标签:
推荐
- 在Golang中使用依赖注入 全球视点
- 新闻1+1丨城市:安全才能让生活更美好
- 专访:中国经济和市场为东盟提供大量发展机会——访印度尼西亚经济统筹部副部长潘布迪
- 记者观察:中国助力中东“和解潮”
- 要闻:驱逐令过期后,美国边境有多乱、乱多久
- 普及自救技能,防范灾害风险 当前看点
- 【世界热闻】现场听民声 实事惠民生(全过程人民民主·在现场)
- 乘号的由来小故事_乘号的由来|世界观察
- 上证四连跌,内资恐慌北向加仓 世界最资讯
- 科普帖!警惕毕业季8大求职陷阱-视点
- 外媒:卢甘斯克市发生爆炸,此前因乌射程原因,冲突以来很少遭袭击
- 焦点访谈: “小”商品“玩”转大市场
- 环球视讯!五部门发文取消高校毕业生就业报到证
- 各地精心组织防灾减灾宣传活动 增强全民防灾意识 环球热消息
- 减肥就必须“戒碳水”?当心“病态瘦”
- 申万宏源证券股票_申万宏源证券机构|世界讯息
- 麻省理工学院的变色墨水可以让你定制你的鞋子_世界百事通
- 全球最新:财政加力支持农村综合性改革(锐财经)
- 天天快看点丨两岸机器人及智慧自动化产业对接活动在河南举行
- 【热闻】中企助力哈萨克斯坦光伏电站建设
- 今日关注:“深切感受到中国现代科技的魅力”(海外纪闻)
- 世界快资讯:中国茶文化在希腊推介
- 5-2拒绝放水,德甲第11爆发,掀翻德甲2冠王,迎来2连胜 全球最新
- 好听的网络游戏昵称_网络游戏昵称大全
- 摩根大通公司首席执行官:美国若债务违约或将导致金融恐慌 焦点资讯
- 全球快播:美国国会预算办公室:美国6月初违约风险显著增加
- 中国乒乓球队抵达南非德班 开启世乒赛征程|天天简讯
- 驻泰使馆提醒在泰同胞谨防假冒使领馆名义实施的电信诈骗
- 每日热点:德机构:近20万家欧洲公司破产,零售和酒店业受打击最大
- 卡瓦哈尔纪念皇马体育城奠基19周年:梦想成真的一刻,加油皇马-天天短讯
- 俄外交部就英国决定向乌克兰提供巡航导弹发表声明
- 俄罗斯总统普京同南非总统通电话 环球微动态
- 世界热头条丨乌克兰总统泽连斯基与英国首相通电话
- 泽连斯基签署法令对协助俄罗斯的多名个人及法律实体实施制裁
- 羽坛高手齐聚苏州 苏迪曼杯即将打响
- 环球热门:大学户口迁移是迁移去了哪里 大学户口迁移
- 【天天快播报】华为nova6和华为p30对比介绍
- 观焦点:未来已来!10个场景看雄安之变
- 环球时讯:中国星辰|天舟“专送” 使命必达
- 达州实施首席数据官制度 促进全市数据共享开放和开发利用|当前速看
- 农夫山泉(09633.HK):5月12日南向资金减持1.72万股 世界今日报
- 被和珅捧杀的钱沣,融合米芾与颜真卿书风,其字刚健婀娜风神独绝 环球热闻
- 每日热议!俄外交部就英国决定向乌克兰提供巡航导弹发表声明
- 吉大通信:业绩说明会定于2023年5月22日举行|每日观点
- 每日短讯:时间和对手都定了,这回国足亚洲杯能走多远?
- 外交部:搞“台独”分裂,注定是绝路一条_天天滚动
- 【热闻】危险的裁决!美法官裁定不能禁止18至20岁青年购枪
- 全球热推荐:汶川地震15周年微纪录片:《汶川·重生》
- 韩国将派专家团赴日考察福岛核污水排海全过程是否安全-视点
- 美国债务上限僵局持续 两党相互指责
- 冲上热搜!女演员近10年无戏演,再见观众红了眼眶
- 饿了么发布最新包装费管理规则
- 对话最前沿丨面朝大海 行“舟”天河 新要闻
- 旧谣新传博眼球 杜撰政策行骗局 环球快看
- 今日辟谣(2023年5月12日)_热议
- 【全球播资讯】乌兹别克斯坦留学生伊娃:来中国留学是我最好的选择 希望成为两国友好交流的使者
- 每日速递:世行中国局局长:汶川地震后很多故事让我深深感动
- 道路交通安全法规定的基本原则_天天即时看
- 快消息!今日求肯特爱的幼儿园的歌词
- 最新:业内:多措并举提升泌尿肿瘤防治水平
- 硬核实力!一起看“上天入地”的“大国重器”
- 渝港澳三地科学家齐聚重庆展开交流 全球要闻
- 土耳其防长:各方即将就延长黑海港口农产品外运协议达成一致 世界最新
- 斯蒂格利茨:其他G7国家施压美国别分裂世界,将会是个好主意
- 海南中学国际班高考分数线 2022海南中学国际班人数|环球关注
- 环球观速讯丨虹桥公园焕新开放!上海长宁城市更新迎来加速度
- 视讯!面对美墨边境移民潮危机 美国两党相互指责
- 乌克兰总统泽连斯基召开最高统帅部会议
- 世界快播:我国7名护理工作者荣获第49届南丁格尔奖
- 外媒:德国警方逮捕一名涉嫌参与居民楼爆炸案的嫌疑人
- 每日速看!日媒:日本2022年度经常项目顺差锐减54%
- 【天天热闻】平坝樱花图片最近_平坝樱花图片
- 平凡之路:左大建和劳春雪的离婚,就像是一场过家家般的闹剧 环球关注
- 脾肾虚的症状表现有哪些_脾肾阳虚有哪些症状
- 欢乐颂钢琴曲简谱左右手_欢乐颂钢琴曲简谱|每日快报
- 天天快播:扩大“互联网+护理服务”试点范围 打通专业护理到家庭“最后一公里”
- 天天热头条丨整治医美乱象,让“美丽”更健康
- 曾被光照亮,如今也想成为光!15年前被救的孩子们写下了这些话 环球热议
- 全球观速讯丨4月份我国汽车产销量同比快速增长 汽车出口继续延续良好态势
- 暗号:单人煎饼!
- 榆林市人大常委会通过一批任免名单
- 全球微资讯!贵阳港澳通行证办理方式
- 哈姆谈G5失利:向对手致敬他们打得更好 我们在比赛中断电了 世界聚看点
- 韩国电力公司拟出售房地产并冻结工资自救,去年亏超225亿美元
- 女超联赛:长春女足小胜河南中原女足|全球焦点
- 【世界新视野】韩国将派专家团赴日考察福岛核污水排海全过程是否安全
- 星火成炬 | 明天会更好 焦点消息
- 天天热消息:汶川地震15周年微纪录片:《汶川·重生》
- 日本京阿尼纵火案将于9月5日首次庭审|天天聚看点
- 白水苹果迎来高光时刻 搭载天舟六号成功升空
- 新一代分布式融合存储发布 加速释放数据要素价值_快消息
- 国产芯片被三星采用,新CXL 2.0内存使用国产主控 环球热推荐
- 最新!福州80户获得公租房拟登记保障资格|世界播报
- 闽清运动健儿在2023年U系列田径联赛(福建赛区)中创佳绩_资讯推荐
- 天天时讯:最新!福州80户获得公租房拟登记保障资格
- 闽清运动健儿在2023年U系列田径联赛(福建赛区)中创佳绩 全球热议
- 亏损券商扫描!亏损逾10亿的有3家 什么原因?这些“新”券商业绩如何?
- 老里:最大问题是分享球差和信任不足 绿军内线尺寸对哈登不利 天天热闻
- 黑河水运口岸对俄轮渡运输恢复开通 焦点滚动
- 天天最新:外交部:敦促七国集团停止搞封闭排他“小圈子” 勿做经济胁迫的同谋帮凶
X 关闭
政策法规
X 关闭