当前位置: 首页 > news >正文

【极客日常】分享go开发中wire和interface配合的一些经验

在先前一篇文章中,笔者给大家提到了go语言后端编程可以用wire依赖注入模块去简化单例服务的初始化,同时也可以解决服务单例之间复杂依赖的问题。但实事求是来讲,用wire也是有一些学习成本的,wire在帮助解决复杂依赖的问题同时,也会限定你去用一些特定的编程方式来满足wire的需要,尤其需要你interface给用的更加灵活。

因此今天这篇文章,笔者结合自己的经验,就和大家浅分享下,wire和interface配合的一些经验,让大家以后用wire的时候避免一些坑。

对于wire的build指令而言,build会检查你依赖对象是属于哪种类型,不能出现重复provide某种类型的情况。也就是说,比如你的某个Service需要一个string的member,那这个string就不好单独provide出来,因为其他Service也大概率存在。所以这种情况下,我们需要通过一个string-provider的interface或者struct去对这个string做一个封装,阐明这个参数的独有业务涵义,这样就不会出现依赖重复的情况。

type ThirdPartyClient struct {Client *HttpClientSecret string // 初始情况下,需要提供一个secret参数
}// 一种方式是通过静态config拿,然后wire.Struct给到ThirdPartyClient
type ThirdPartyConfig struct {Secret string
}type ThirdPartyClient struct {Client *HttpClientConfig *ThirdPartyConfig
}func NewThirdPartyClient(httpClient *HttpClient, config *ThirdPartyConfig) *ThirdPartyClient {return &ThirdPartyClient{Client: httpClient,Config: config,}
}// 另一种方式是抽象一个SecretProvider的interface,可以处理动态获取Secret的情况
type ISecretProvider interface {GetSecret() string
}type ThirdPartyClient struct {Client *HttpClientSecretProvider ISecretProvider
}func NewThirdPartyClient(httpClient *HttpClient, secretProvider ISecretProvider) *ThirdPartyClient {return &ThirdPartyClient{Client: httpClient,SecretProvider: secretProvider,}
}

那这里就衍生出新的问题,如果我有很多Secret,一个SecretProvider不够,那怎么办?这个也好办,因为本质上来讲,对于每一个参与wire的实例,我们都需要阐明其的独有业务涵义。也就是说,你得在ISecretProvider基础上,定义IAAASecretProvider、IBBBSecretProvider以及ICCCSecretProvider这种。或者换个例子,我们wire一些缓存模块给业务service,缓存模块就需要这么设计。

type ICache interface {Get(key string) (string, error)Set(key string, value string, expiration time.Duration) error
}type ILocalCache interface {ICache
}type IRemoteCache interface {ICache
}func NewGoCache() ILocalCache {// TODO
}func NewRedisCache() IRemoteCache {// TODO
}

通过这样写,不仅可以区分LocalCache和RemoteCache,满足wire的要求,同时对于其它开发者,也能够清楚知道当前是使用Local和Remote的Cache来做业务逻辑,这样就不会出现误用。

http://www.dtcms.com/a/225852.html

相关文章:

  • DRW - 加密市场预测
  • 多自主水下航行器(AUV)协同围捕策略
  • 蓝桥云课ROS学习C++教程cpp-geeksforgeeks版本
  • 【AI论文】SWE-rebench:一个用于软件工程代理的任务收集和净化评估的自动化管道
  • Cinnamon开始菜单(1):获取应用数据
  • 基于Dify实现各类报告文章的智能化辅助阅读
  • 数据共享交换平台之数据资源目录
  • 大模型登《情报学报》!大模型驱动的学术文本挖掘!
  • 内存管理 : 05 内存换入-请求调页
  • 【萌笔趣棋】网页五子棋项目测试报告
  • unix/linux source 命令,其基本概念、定义、性质、定理
  • 适配器模式:让不兼容接口协同工作
  • 远程管理SSH服务的搭建
  • Java进阶---JVM
  • (javaSE)Java数组进阶:数组初始化 数组访问 数组中的jvm 空指针异常
  • DAY 35 超大力王爱学Python
  • 【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
  • yolo个人深入理解
  • PINN模型相关原理
  • rtpmixsound:实现音频混音攻击!全参数详细教程!Kali Linux教程!
  • 主数据编码体系全景解析:从基础到高级的编码策略全指南
  • Python数学可视化——环境搭建与基础绘图
  • python汉语编程,将关键字与文言文对应
  • 源码解析(二):nnUNet
  • 03.MySQL表的操作详解
  • K3s简介、实战、问题记录
  • Java高效处理大文件:避免OOM的深度实践
  • 【STM32F1标准库】理论——外部中断
  • 用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2
  • 纯汇编自制操作系统(四、应用程序等的实现)