深入解析:Google开源Wire框架的依赖注入应用

更新:11-09 民间故事 我要投稿 纠错 投诉

本篇文章给大家谈谈深入解析:Google开源Wire框架的依赖注入应用,以及对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

看看各大博客对八部分论文的评价

依赖注入是一种用于管理对象之间依赖关系的设计模式。依赖注入的核心思想是将对象的依赖关系从代码中分离出来,从而使代码更加灵活和可维护。在依赖注入中,对象不再负责创建它所依赖的对象,而是外部容器负责创建和管理对象之间的依赖关系。

简单来说,类A需要调用其他类B、C、D等,现在类A可以调用类E。类B、C、D统一实例化在类E中。

常规类依赖方式

构造函数注入

构造函数注入是最常见的依赖注入方法。在构造函数中,将依赖对象作为参数传递给对象的构造函数

类型用户服务结构体{

用户存储库*用户存储库

}

func NewUserService(userRepository *UserRepository) *UserService {

返回UserService{userRepository: userRepository}

}UserService 依赖于UserRepository。在NewUserService函数中,将UserRepository作为参数传递给UserService构造函数,并将其保存在UserService结构体中。这样,在创建UserService对象时,需要先创建一个UserRepository对象,并将其传递给NewUserService函数

属性注入

属性注入是将依赖对象作为对象属性注入的方法

类型用户服务结构体{

用户存储库*用户存储库

}

func (u *UserService) SetUserRepository(userRepository *UserRepository) {

u.userRepository=userRepository

}UserService 依赖于UserRepository。通过SetUserRepository方法将UserRepository注入到UserService中

方法注入

方法注入是将依赖对象作为方法参数注入的一种方式

类型UserService 结构体{}

func (u *UserService) SaveUser(用户*User, userRepository *UserRepository) 错误{

返回userRepository.SaveUser(用户)

}UserService 依赖于UserRepository。通过SaveUser方法将UserRepository注入到UserService中

全局变量

如果想要更简单,并且依赖的资源是线程安全的,也可以直接定义一个全局变量来存储类,这样整个项目就可以直接调用该变量,这样更简单。特别适合一些非脚手架框架、定制化程度高的轻量级框架,比如Gin等。

手动依赖项注入的一些好处包括:

跟踪源代码会更容易,因为依赖项显式传递给函数或构造函数,例如go-zero 框架的svc。管理依赖关系更简单。测试依赖于手动依赖项注入的代码会更容易,尤其是当依赖项相互依赖时。在松耦合的情况下。

三方依赖注入库

手动管理依赖关系实际上非常好。它可能不适合某些对代码自动化痴迷且类太多的场景。 Google的Wire、Facebook的Inject和Uber的Dig都是星级比较高的库。

kratos中的wire应用

自我描述:wire是一个用golang编写的库。通过执行wire命令,会生成xx_gen.go文件,帮助您调用类依赖。

只需一个命令即可安装电线

获取github.com/google/wire/cmd/wire

wire中有几个概念和常用方法

提供商

各个目录下的包中的类注册

注射器

注意wire_gen.go文件中, //+buildwireinject注释保证了我们正常编译时不会引用这个文件,并且wire_gen.go生成的文件中会包含//+build!wireinject 注释,会编译通常情况下。当时,将在不指定标签的情况下引用该文件。

电线.Build()

声明需要调用哪些提供者函数来获取

将常用的依赖项组合在一起

线.NewSet()

我们通过新增一个单独模块api接口来演示依赖注入

kratos框架目录结构,几个重要目录

api是定义接口服务的地方。 cmd是项目的main方法入口文件,一切的来源。 configs静态配置文件internal是项目的核心文件,相当于大部分时间编码的地方。

4.1 biz逻辑层、业务逻辑层

4.2conf配置文件读取

4.3 服务器http和grpc实例的创建和配置

4.4 服务api目录

第一步:api目录中定义服务

api/workbench/v1/workbench.proto中定义的接口服务句柄层

rpc ProjectCommonList(ListPortfolioRequest) 返回(ListPortfolioReply){

选项(google.api.http)={

post: "/workbench/v1/commonproject/list"

正文:"*"

};

}

第二步:生成对应的pb类

命令行执行

使api

第三步:编写对应的接口handle方法

内部/service/workbench.go

商业服务是新逻辑

类型WorkbenchService 结构{

v1.未实现的WorkbenchServer

日志*log.Helper

userService *biz.UserService

文件服务*biz.FileService

项目服务*biz.ProjectService

commonProjectService *biz.CommonProjectService

评论服务*biz.评论服务

teamService *biz.TeamService

spaceService *biz.SpaceService

投资组合服务*biz.投资组合服务

permService *biz.PermService

商业服务*biz.CommercialService

}

func NewWorkbenchService(记录器log.Logger, userService *biz.UserService, fileService *biz.FileService, projectService *biz.ProjectService,

评论*biz.ReviewService、团队*biz.TeamService、空间*biz.SpaceService、投资组合*biz.PortfolioService、

烫发*biz.PermService、商业*biz.CommercialService、commonproject *biz.CommonProjectService) *WorkbenchService {

返回工作台服务{

log: log.NewHelper(记录器),

userService: 用户服务,

文件服务: 文件服务,

项目服务: 项目服务,

评论服务:评论,

teamService:团队,

spaceService:空间,

投资组合Service: 投资组合,

permService: 烫发,

商业服务: 商业,

commonProjectService: 公共项目,

}

}

func (w *WorkbenchService) ProjectCommonList(ctx context.Context, request *v1.ListPortfolioRequest) (*v1.ListPortfolioReply, error) {

ret :=v1.ListPortfolioReply{

Action: 请求.Action,

Model:请求。型号,

RequestId: 请求.RequestId,

UserIds: make([]uint32, 0),

}

数据,userIds,错误:=w.commonProjectService.ProjectCommonList(ctx,请求)

如果错误!=nil {

如果se :=new(kraErrors.Error); kraErrors.As(err, se) {

ret.Code=se.Code

ret.Message=se.Message

返回ret,无

}

w.log.Errorf("SetDefaultTab 操作失败,err=%v", err)

返回零,错误

}

ret.Data=数据

ret.UserIds=用户Ids

返回ret,无

}

第四步:编写对应的接口logic方法

在biz文件夹中,创建一个新的commonproject.go文件

内部/biz/commonproject.go

包裹业务

进口(

"语境"

v1 "工作台/api/工作台/v1"

"github.com/go-kratos/kratos/v2/log"

//CommonProjectService项目相关接口

类型CommonProjectService 结构{

日志*log.Helper

}

func NewCommonProjectService(记录器log.Logger) *CommonProjectService {

返回CommonProjectService{

log: log.NewHelper(记录器),

}

}

func (s *CommonProjectService) ProjectCommonList(ctx context.Context, request *v1.ListPortfolioRequest) (*v1.ListPortfolioReply_Data, []uint32, error) {

返回零,零,零

}

第五步:将刚才新增的CommonProjectService.go类,注册到wire体系中

在krato框架的每个目录下,都有一个与文件夹同名的xxx.go文件,用于wire的注册功能。

内部/biz/biz.go

包裹业务

进口(

"工作台/内部/biz/conf"

"github.com/google/wire"

//ProviderSet 是数据提供者。

var ProviderSet=wire.NewSet(NewFileService, NewProjectService, NewReviewService, NewUserService, NewTeamService, NewSpaceService, NewPermService, NewPortfolioService, NewCommercialService, conf.NewTabService, NewBroadcastScopeService, NewCommonProjectService)

第六步:生成wire依赖注入

cmd/workbench/在入口目录下执行命令行

电线

第七步:运行项目

制作构建

./bin/workbenchcurl 0.0.0.0:8001/workbench/v1/commonproject/list

步骤回顾

在kratos框架中,习惯上在每个目录下新建一个与文件夹同名的xx.go文件,用于注册该目录下的类。例如biz目录下的biz.go中,wire.NewSet()注册该目录下的所有类

main.go 是主要注册入口。该文件夹中有一个wire.go文件。每个目录中的所有依赖注册文件都是通过wire.Build方法加载的。通过wire命令生成一个wire_gen.go文件【该文件无法编辑。由电线本身维护]

有线网络

funcwireApp(*conf.Server, *conf.Data, *conf.App, *conf.Registry, *conf.Auth, *conf.Plan, log.Logger) (*kratos.App, func(), error) {

恐慌(wire.Build(server.ProviderSet,service.ProviderSet,data.ProviderSet,newApp,biz.ProviderSet))

}main.go

在主文件中,可以通过调用wire_gen.go中的wireApp方法来加载和使用所有类。

如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

心亡则人忘

看来谷歌又出来个新的东西了!

    有19位网友表示赞同!

话少情在

依赖注入是挺好的设计思路,可以让代码更松耦合。

    有15位网友表示赞同!

烬陌袅

开源的好处就是大家可以一起学习和改进。

    有15位网友表示赞同!

一笑傾城゛

这个wire听起来像是个很精简的工具吧?

    有19位网友表示赞同!

纯情小火鸡

对入门编程的朋友来说,这会不会比较复杂?

    有18位网友表示赞同!

暖瞳

期待看看有人能用这个wire写出一些有趣的应用!

    有12位网友表示赞同!

逃避

我的项目可以考虑试试看,如果简单就能上手的话。

    有5位网友表示赞同!

莫失莫忘

希望官方能够提供详细的文档和教程。

    有6位网友表示赞同!

陌離

开源项目需要大家共同参与维护,一起开发吧!

    有15位网友表示赞同!

冷嘲热讽i

谷歌的产品一向质量不错,这个wire应该也值得期待。

    有6位网友表示赞同!

涐们的幸福像流星丶

不知道这个wire会不会和其他流行框架兼容?

    有11位网友表示赞同!

棃海

如果能方便地集成到现有项目中就更好了。

    有6位网友表示赞同!

又落空

依赖注入这种模式确实可以提高代码的可维护性和可测试性。

    有6位网友表示赞同!

妄灸

现在很多大型项目的开发都离不开这样的工具了。

    有16位网友表示赞同!

冷落了♂自己·

这个wire会不会在安卓开发领域有应用?

    有19位网友表示赞同!

三年约

学习一下新的技术总是件好事,提升一下自己的技能!

    有11位网友表示赞同!

浮殇年华

期待能看到更多开源社区对该项目的发展支持!

    有7位网友表示赞同!

【深入解析:Google开源Wire框架的依赖注入应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:3ds Max 免费资源下载汇总:百度云、迅雷、夸克网盘一站式整理 下一篇:《伍叁:七つの大罪日版(单行本)献给特别的你》