@
matrix1010 #70 但这里的 di 并不是必需品吧
相比于:
err = container.Provide(ai.NewAiService,
dig.As(new((ai.AiService))))
if err != nil {
panic(err)
}
err = container.Provide(table.NewTableService,
dig.As(new((table.TableService))))
if err != nil {
panic(err)
}
简简单单的这种也可以:
aiService, err := ai.NewAiService(...)
if err != nil {
panic(err)
}
tableService, err := table.NewTableService(config, db, aiService...)
if err != nil {
panic(err)
}
多个 Provide 的都是这种,而且每个 Provide 也都有 if err ,真没看出来哪里变得简化了,反倒增加了 di 本身的隐含逻辑需要额外去理解、更绕了
这里最核心的能够方便 mock 的,就是
dig.As ,而这个本质上是实现 interface 。
至于 di 本身的逻辑、对于熟悉设计模式熟悉 di 的人当然不算什么,即使不懂的人简单看看也不算什么负担,但相比于本可以简简单单的方式,毕竟还是多了一道弯弯绕