求生欲:仅自己想的一个解决方法,如有不妥之处,还望大家不吝赐教,及时纠正我。

正文开始:

工厂方式创建对象,无非是想根据不同的参数获取到创建的不同对象。

先抛一个结论,kratos框架中,data(包)层会依赖于biz(包)层。

下面这段伪代码方法是写在biz包的一个UseCase.go中,而NewIosP8(xx,xx)是属于data包的xxx,所以在此处就有了biz包依赖data包,在结合上面的结论。

func (cuc *CertificateUseCase) GetCerInter(Type string) CertificateRepo {switch Type {case constant.IOS_P8:return data.NewIosP8(xx,xx);default:return nil}
}

问题:go中不允许不同的包相互依赖,因此编译启动项目时会报循环依赖的错误。

解决:kratos中使用了wire的编译时依赖注入,将UseCase.go中所有这个方法可能创建出来的对象都提前创建出来,并关联到这个UseCase下,如下图:

func wireApp(confServer *conf.Server, confData *conf.Data, logger log.Logger) (*kratos.App, func(), error) {dataData, err := data.NewData(confData, logger)if err != nil {return nil, nil, err}parentCertificateRepo := data.NewParentCertificateRepo(dataData, logger)iosP8CertificateRepo := data.NewIosP8Certificate(dataData)iosPCertificateRepo := data.NewIosPCertificate(dataData)andHuaweiCertificateRepo := data.NewAndHuaweiCertificate(dataData)andMeizuCertificateRepo := data.NewAndMeizuCertificate(dataData)miAndGoogleRepo := data.NewMiAndGoogle(dataData)andOppoCertificateRepo := data.NewAndOppoCertificate(dataData)andVivoCertificateRepo := data.NewAndVivoCertificate(dataData)certificateUseCase := biz.NewCertificateUseCase(parentCertificateRepo, andHuaweiCertificateRepo, iosPCertificateRepo, iosP8CertificateRepo, andMeizuCertificateRepo, miAndGoogleRepo, andOppoCertificateRepo, andVivoCertificateRepo, logger)certificateService := service.NewCertificateService(certificateUseCase)grpcServer := server.NewGRPCServer(confServer, appService, certificateService, imUserStaticService, userService, clientAppService, logger)app := newApp(logger, grpcServer)return app, func() {//cleanup()}, nil
}

创建certificateUseCase的时候将前面创建好的xxxRepo都关联进去。后面的工厂方法就可以这样写了,如下图:

func (cuc *CertificateUseCase) GetCerInter(Type string) CertificateRepo {switch Type {case constant.IOS_P8:return cuc.iosP8case constant.IOS_P12, constant.IOS_Push_Kit:return cuc.ioscase constant.MI, constant.Google:return cuc.miAndGooglecase constant.HuaWei:return cuc.huaweicase constant.MeiZu:return cuc.meizucase constant.VivoAnd:return cuc.vivocase constant.OppoAnd:return cuc.oppodefault:return nil}
}

我们只需要将已经创建好的对象根据传入的不同Type值直接返回即可。

go语言使用kratos框架,使用工厂模式创建对象时,biz层和data层出现循环依赖的错误解决方案相关推荐

  1. 二次封装图片第三方框架——简单工厂模式的运用

    CSDN首发地址: 前言 写在前头,这篇博客对于老司机们没什么多大的意义,老司机们就不用看了,对于新手还是有很大实用价值的. 平时在项目中,你们有没有遇到这样的情况,比如之前项目是使用开源框架Imag ...

  2. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象

    课程介绍 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8 ...

  3. JavaScript学习(四十二)—利用工厂模式创建对象以及工厂模式创建对象的不足

    JavaScript学习(四十二)-利用工厂模式创建对象以及工厂模式创建对象的不足 一.利用工厂模式创建对象 工厂模式是JavaScript中的一种设计模式,它的作用是批量创建具有同种属性的对象. 格 ...

  4. C语言和设计模式(抽象工厂模式)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们写过的工厂模式实际上是对产品的抽象.对于不同的用户需求,我们可以给予不同的产品,而且这 ...

  5. Spring框架之工厂模式

    简单的工厂模式 工厂模式:把原来分布在各个地方的对象的创建过程单独抽离出来,统一交给工厂类来创建所需的对象. (需要使用对象的时候,不要自己去new,通过工厂(方法)来创建对应的对象) 1.常规模式创 ...

  6. java为什么用工厂模式_【Java】为什么建议没事不要随便用工厂模式创建对象?...

    一般情况下,工厂模式分为三种更加细分的类型:简单工厂.工厂方法和抽象工厂.在这三种细分的工厂模式中,简单工厂.工厂方法原理比较简单,在实际的项目中也比较常用.而抽象工厂的原理稍微复杂点,在实际的项目中 ...

  7. 王争 | 设计模式之美 - 工厂模式:我为什么说没事不要随便用工厂模式创建对象?

    1. 简单工厂(Simple Factory) 在下面这段代码中,我们根据配置文件的后缀(json.xml.yaml.properties),选择不同的解析器(JsonRuleConfigParser ...

  8. JS中使用工厂模式创建对象

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  9. go语言使用thrift协议实现客户端和服务端报not enough arguments in call to oprot.WriteMessageBegin错误解决方案

    正常步骤: 安装golang的Thrift包: go get git.apache.org/thrift.git/lib/go/thrift 安装 Thrift 的 IDL 编译工具: http:// ...

最新文章

  1. 使用Crypto++库编译出错 解决办法
  2. 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】
  3. 反向传播算法最全解读,机器学习进阶必看!
  4. MFC无标题栏对话框移动的处理方法
  5. 2018年90后薪资报告出炉:你在哪个级别???
  6. magic_quotes_gpc合magic_quotes_runtime的区别!
  7. Inno Setup 系列之自定义卸载文件名称的脚本
  8. 入行网络工程师一年的心得体会
  9. 【HDU2825】AC自动机+状压DP
  10. 听说想当黑客的都玩过这个Monyer游戏
  11. android俄罗斯方块报告,Android 俄罗斯方块
  12. Codefrces 869C. The Intriguing Obsession
  13. python数据分析与展示--图像的手绘效果
  14. vue 获取动态域名_vue项目接口域名动态获取操作
  15. 支持ESMTP身份验证的邮件发送
  16. Visual Studio 2019 (VS2019)安装Spy++工具
  17. Qt编写视频监控管理平台(支持海康/大华/宇视/华为/天地伟业/H264/H265等)
  18. 罗振宇2023“时间的朋友”跨年演讲原版PPT(附下载)
  19. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) H.了断局-递推
  20. Cortex-M4 浮点数的存储 和 FPU(Floating Point Unit) 杂记

热门文章

  1. 生物信息学|利用层注意图卷积网络预测药物-疾病关联
  2. phpstudy_pro 前端小白建站利器 —— 【PhpStudy + WordPress + 花生壳 超详细教程】
  3. 圆心科技旗下药房再被处罚:两次递表港交所,腾讯、红杉等为股东
  4. 偏微分方程的数值解(五): 二维状态空间的偏微分方程的 MATLAB 解法
  5. 一个matlab遗传算法源程序
  6. 3d建模自学难吗?难点在哪儿?
  7. JVM之关于GC的扩展知识
  8. 重量级发布!工业软件企业大全(第一辑)
  9. 几种单USB转多串口的方案
  10. 扬帆际海:东南亚为何成为跨境消费天堂?