请教 golang 依赖注入的实际问题

28 天前
 chaleaochexist

我有一个 task 通过 ssh 运行 N 种命令, 假设 ls -lcat /etc/host吧. 然后把输出存起来.

理想中的结构是:

task 依赖 handler 依赖 sshclient

其中,

handler 是函数, 参数是 sshclient, 一个 handler 执行一种命令

sshclient 是接口, 干活的.

这个 sshclient 实例化过程只能在 task 中动态生成, 因为 sshclient 需要的 ip 是在 task 中的其他函数获取的.

我得问题:

  1. task 依赖 handler. 但是 handler 的参数的类型(也就是 sshclient) 定义在 task 中, 这不循环导入了吗?

目前的解决方案是, 我在 handler 和 task 中分别定义两个一模一样的接口, 然后通过适配的方式能让代码运行. 我不确定这样处理是否合理? 还是说我这个设计本身就有问题? 通过注入接口能实现吗?

  1. 当一个接口的实现的依赖是动态数据的时候, (譬如 sshclient 中的 ip, 端口, 认证信息), 还需要注入吗? 如何注入? 我目前采用的方案是注入一个无参的返回值是工厂函数的函数...然后再 task 中实例化 sshclient. 补充: sshclient 可能有 100 个, 不是一个固定的 client. 说白了我是通过 ssh 采集信息的. 和 *db.DB 不是一个类型.

目前有点混乱, 如果我没问清楚欢迎各位大佬提出你的疑问 我尽量补充信息.

2308 次点击
所在节点    Go 编程语言
44 条回复
sthwrong
27 天前
@chaleaochexist #38 就算不是来自 repo ,如果来自其他模块的方法,让 provider 依赖这个模块的方法,如果需要方法中的客户端数据可以被 mock ,就给这给方法的实例定义一个接口,test 的时候传一个自定义的实现了方法的实例。我的 main 方法直接调用的原始实现,test 里面大多数都给了 mock 实现,所以打印的结果才又 mock 信息。
chaleaochexist
27 天前
@NessajCN 我没话讲了大佬, 后端 这么做不是太正常了吗?
一个 service 有多少个 io 操作啊 这都是最简单的了.
chaleaochexist
27 天前
@sthwrong 虽然你说的有瑕疵, 但是给我提供了新思路,我明天试一下. 谢谢佬友!!!
chaleaochexist
26 天前
@sthwrong #34
"依赖就分错了,provider 依赖 repo , 提供方法返回 clients ,handler 依赖 clients ,提供方法根据传入 clients 和 cmd 构建单个或者多个 handler ,task 依赖 handler ,提供方法执行 handler ,每个实现自己声明一个接口 。依赖清晰了,每一层都可以在 test 中声明新的 mock 实例实现 mock 方法替代调用。"

提供方法返回 clients 中的 clients 是接口还是结构体, 接口的话定义在哪里?
针对这个问题 我又 发了个帖子
https://v2ex.com/t/1152334#reply0

大佬感兴趣的话, 点拨一二..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1151824

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX