gpt4 book ai didi

数组作为 Provider 的参数的 GoLang go-cloud/wire 问题

转载 作者:IT王子 更新时间:2023-10-29 01:04:00 26 4
gpt4 key购买 nike

我在正确配置电线时遇到了一些问题,我有以下设置

路由器

func NewRouter(routes []RouterPath) AppRouter {
r := &appRouter{
routes: routes,
}
return r
}

路由器接口(interface)

type RouterPath interface {
Register(root *mux.Router) (p *mux.Router)
}

我确实有几个 Controller 实现了这个接口(interface)目前我找到如何制作电线来解决 DI 的最好方法是这个

var routersSet = wire.NewSet(
routers.NewAuth,
routers.NewRoot,
routers.NewUser,
routers.NewPhpInfo,
)

func RouterProvider(info *routers.PhpInfo, root *routers.Root, user *routers.User) web.AppRouter {
routes := []web.RouterPath{
info,
root,
user,
}
return routers.NewRouter(routes)
}

func Init() Kernel {

wire.Build(
routersSet,
RouterProvider,
NewKernel,
)

return nil
}

我遇到的问题是我必须将过渡层设置为 NewRouter,因为它需要路由数组。这将很容易增长,并且方法定义将很难维护。我很想看到 smtg 将 wire.ProviderSet 放入数组并将其用作 NewRouter 的参数,但我不知道该怎么做。

有没有更好的方法代替这个?

最佳答案

仅从这个小片段很难看到您的应用程序的全貌,但最好将您正在构建的路由器的依赖项纳入 RouterProvider 并构建它们在函数中。

但是,如果您评估它并发现它不合适,您仍然有一些选择。如果您只是担心 RouterProvider 的参数列表变长,那么您可以使用结构提供程序:

type routers struct {
Info *routers.PhpInfo
Root *routers.Root
User *routers.User
}

func RouterProvider(r routers) web.AppRouter {
return routers.NewRouter([]RouterPath{
r.Info,
r.Root,
r.User,
})
}

如果这变得非常笨拙,您可以使用反射将字段压缩成一个 slice :

type routers struct {
Info *routers.PhpInfo
Root *routers.Root
User *routers.User
}

func RouterProvider(r routers) web.AppRouter {
value := reflect.ValueOf(r)
var paths []RouterPath
for i := 0; i < value.NumField(); i++ {
if p, ok := value.Field(i).Interface().(RouterPath); ok {
paths = append(paths, p)
}
}
return routers.NewRouter(paths)
}

不过,我真的推荐第一种方法,因为阅读您的代码的人可以更清楚地知道发生了什么。反射总是将破坏转移到运行时而不是编译时。

关于数组作为 Provider 的参数的 GoLang go-cloud/wire 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com