V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  kkhaike  ›  全部回复第 8 页 / 共 36 页
回复总数  715
1 ... 4  5  6  7  8  9  10  11  12  13 ... 36  
2022-08-04 19:26:30 +08:00
回复了 a132811 创建的主题 Go 编程语言 感觉 uber/fx 并不比 getInstance 工厂好用
另外我在说说 fx. Lifecycle ,这个东西是你 getInstance 怎么都做不到的。
想象一下一个几十个 Provide 瞬间无措优雅关停的快感。。

什么,你们你们不优雅关停。。那么当我多说了
2022-08-04 19:15:51 +08:00
回复了 a132811 创建的主题 Go 编程语言 感觉 uber/fx 并不比 getInstance 工厂好用
我使用 fx 大概两年左右,下面就针对楼主各点给出我的看法。。

PS1. 新出的 fx.Module 还没想到用得到地方,可能我项目不够大吧。

# 手动维护依赖属性
使用 fx.In 参数对象解决依赖问题,我一般一个依赖一个包,所以都是这样写的 New 护士

```
// dep 专门用来给 fx 注入参数
type dep struct {
fx.in

dao dao.M // 为了单测方便,数据层的一般都提供 interface
busi busi.M
}

// 这里看这个模块的情况,想被 mock 就写
// type M interface {
// bala()
// }
type M = *module

type module struct {
*dep // 内嵌指针就好了

some int // 内部变量
}

// 私有参数,让其无法手动调用,只用来 fx
func New(d dep) M {
return &module(dep: &dep)
}

```

server->service->db Provide 定义问题,因为我每个 Provide 都分包的,
所以要增加一个 fx.Invoke 去注册 service 到 server

所以,Server 是单独 New 出 Provide 的,无依赖(他被人依赖)
所以就有三个 fx.Provide
1. dao.New 无依赖
2. service.New 依赖 dao
3. server.New 无依赖
两个 fx.Invoke
4. service.Reg 依赖 server, service ,实现 server.Reg(service)
2. server.Life 注册 server 启停,注意最好用 fx.Lifecycle 注册,不要直接调用

如果嫌弃一个 service 定义两个 Option 很麻烦的话,
实际上,service.M 基本不会被其他 Provide 使用,所以也可以省略 service.New ,
直接在 service.Reg 中完成,New 和 绑定操作

可以看出。实际上加属性,也只需要修改一个地方,即 dep 成员,整个也很简单

# 写单元测试有点麻烦
与楼主相反,我觉得倒是写 UT 非常简单。。

由于我按每个 Provide 分包,所以 UT 分为 Provide 内 UT ,Provide 间 UT

Provide 内 UT ,直接 new 对象,按需初始化成员就好了,不要走 New 函数创建对象,
因为 和其他的 Provide 内 无关,所以 UT 根本不需要 fx 介入,比如我上面依赖 dao.M 的例子
可以直接创建该成员 mock 对象

Provide 间 UT ,由于 fx 的特殊原因,以及 go 的循环引用问题,所以 Provide 间 UT 只能用在
黑盒测试,我是这么处理的

有一个 app 模块 管理所有 Provide/Invoke ,main 直接调用 app.App().Start() 启动程序

```
func TestXXX(t *testing.T) {
var m some.M
defer fxtest.New(t, app.Provides(), fx.Populate(&m)).RequireStart().RequireStop()
}
```

你还可以用新出的 fx.Replace 替换链上的依赖为 mock

# 其他点
5. 性能损失:fx 只作用于你程序的初始化阶段。。。这个阶段谈性能损失?
6. 调试、维护略复杂,你可能是没用 fx.Logger ,我用了 2 年都没有调试过 fx
2022-07-23 18:01:22 +08:00
回复了 vlitter 创建的主题 Google 悲剧了, google voice 号被收回了,哪位大哥帮忙验证一下
我也被收回了,有啥办法拿回
2022-07-11 10:16:48 +08:00
回复了 revalue 创建的主题 macOS 想换电脑了,旧 macbook 怎么伪装成坏掉的样子
小锤 40
2022-06-05 15:12:46 +08:00
回复了 KanadeCCCC 创建的主题 Apple 说说看大家心目中的 iPad /iPadOS
其实 IpadOS 增加个 HyperV 不知道生产力高多少
2022-06-02 13:57:29 +08:00
回复了 liuchenx 创建的主题 机械键盘 ikbc 这品控不行啊
我也是 ikbc 的,这家伙蓝牙经常卡。但是接 m1 的蓝牙又会好一点。。接 2018 款 就不行
2022-05-05 12:41:11 +08:00
回复了 shawnliu03 创建的主题 iDev 业余玩家如果进行 iOS 开发
@shawnliu03 完全辅导解惑性质也行
2022-05-04 18:22:53 +08:00
回复了 shawnliu03 创建的主题 iDev 业余玩家如果进行 iOS 开发
@shawnliu03 要不一起合作。我也有几年没写了。想重新熟悉下。wx: a2toYWlrZQ==
2022-04-23 17:23:41 +08:00
回复了 tlmn 创建的主题 Go 编程语言 golang 有什么好用的命令行解析实现库么
2022-04-23 17:22:52 +08:00
回复了 tlmn 创建的主题 Go 编程语言 golang 有什么好用的命令行解析实现库么
2022-04-23 09:17:52 +08:00
回复了 WintersZhang 创建的主题 Go 编程语言 有 go 的多功能工具库推荐吗
2022-04-23 09:12:34 +08:00
回复了 tlmn 创建的主题 Go 编程语言 golang 有什么好用的命令行解析实现库么
我的项目一般都用
github.com/urfave/cli/v2
2022-03-15 10:49:40 +08:00
回复了 kkhaike 创建的主题 问与答 哪里能找到有偿靠谱的日文脚本翻译
@hakufuasano 现在万字大概多少钱
2022-03-14 21:09:34 +08:00
回复了 kcojkcnw 创建的主题 酷工作 [上海/北京] 小红书/ Java /30-50k ✖️ 15
上海的办公区在哪
2022-02-15 18:45:18 +08:00
回复了 albert0yyyy 创建的主题 Android 小米平板内存扩容水深不深
原帖在哪 瞅瞅
2021-11-11 14:27:38 +08:00
回复了 kkhaike 创建的主题 全球工单系统 微信 IOS 版本的存储空间是不是有问题啊
我确定我重装前是有这个“清理”功能的,然后我发现安卓版本没有还暗暗自喜过。微信私下里有小操作。。

主要是为啥是双倍容量啊
2021-08-01 20:53:39 +08:00
回复了 kkhaike 创建的主题 macOS 系统根目录下有个名为 1 的文件,是恶意程序产生的吗
是网易 mumu 的驱动
kextstat -l 可以查到
2021-05-25 11:26:38 +08:00
回复了 coolair 创建的主题 全球工单系统 国内的某数据库厂商真是恶心
可能是华为的 GaussDB
1 ... 4  5  6  7  8  9  10  11  12  13 ... 36  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2760 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 33ms · UTC 14:34 · PVG 22:34 · LAX 06:34 · JFK 09:34
Developed with CodeLauncher
♥ Do have faith in what you're doing.