Go 处理依赖注入

Go 处理依赖注入,go,dependency-injection,refactoring,Go,Dependency Injection,Refactoring,假设我有以下代码: 导入( handlerA“一些/路径/handlerA” handlerB“一些/路径/handlerB” handlerC“一些/路径/handlerC” handlerD“一些/路径/handlerD” .... handlerZ“some/path/handlerZ” ) func DoSomething(a handlerA.a,b handler b.b,c handler c.c,d handler d.d.,z handler z.z){ a、 DoA() b、

假设我有以下代码:

导入(
handlerA“一些/路径/handlerA”
handlerB“一些/路径/handlerB”
handlerC“一些/路径/handlerC”
handlerD“一些/路径/handlerD”
....
handlerZ“some/path/handlerZ”
)
func DoSomething(a handlerA.a,b handler b.b,c handler c.c,d handler d.d.,z handler z.z){
a、 DoA()
b、 DoB()
c、 文件(
d、 国防部()
....
z、 DoZ()
}
显然,我使函数
DoSomething(…)
可模拟,因为这使我的函数单元可测试。但正因为如此,我得到了许多参数,因为我的函数需要注入所有依赖项


在Golang中是否有更好的方法来处理许多依赖项

处理多个注入的一种方法是使用结构作为包装器:

键入SomethingDoer结构{
a handlerA.a,
b handler,b.b,
汉德尔,
汉德勒博士,
...
汉德勒,
}
func(sd SomethingDoer)DoSomething(){
sd.a.DoA()
sd.b.DoB()
sd.c.文件()
国防部科学司()
....
sd.z.DoZ()
}

我只是通过自己再次阅读这个问题才发现…

处理许多注入的一种方法是使用结构作为包装器:

键入SomethingDoer结构{
a handlerA.a,
b handler,b.b,
汉德尔,
汉德勒博士,
...
汉德勒,
}
func(sd SomethingDoer)DoSomething(){
sd.a.DoA()
sd.b.DoB()
sd.c.文件()
国防部科学司()
....
sd.z.DoZ()
}

我只是通过自己再次阅读这个问题才发现…

这看起来更像是一个设计问题。有那么多依赖项是一种代码味道,表明函数可能做得太多了。其中一些依赖可能需要聚合到一个服务中,我故意夸大了这一点。我永远不会编写这样的代码。但是我想说的是,具有两个或三个依赖注入参数的函数非常常见。特别是当你因为截止日期或类似的原因没有足够的时间重构代码时。你可能想看看哪一个是golangOr的依赖注入框架,它是第一方,尽管不是stdlib的一部分。
.DoA()
.DoB()
之间有什么区别?它们都可以是
.Do()
。现在可以定义一个接口,如
typedoer接口{Do()}
,签名可以更改为
DoSomething(…Doer)
。这看起来更像是一个设计问题。有那么多依赖项是一种代码味道,表明函数可能做得太多了。其中一些依赖可能需要聚合到一个服务中,我故意夸大了这一点。我永远不会编写这样的代码。但是我想说的是,具有两个或三个依赖注入参数的函数非常常见。特别是当你因为截止日期或类似的原因没有足够的时间重构代码时。你可能想看看哪一个是golangOr的依赖注入框架,它是第一方,尽管不是stdlib的一部分。
.DoA()
.DoB()
之间有什么区别?它们都可以是
.Do()
。现在可以定义一个像
typedoer接口{Do()}
这样的接口,签名可以更改为
DoSomething(…Doer)
。这并没有减少依赖性,只是将它们分组到一个结构中。必须提供一个结构值,您还需要使用相同的依赖项对其进行初始化。是的,但这样可以避免在函数中使用许多参数,我想这会使代码更具可读性。还可以想象一下,如果需要在多种情况下调用此函数:使用包装器,您只需要注入依赖项一次。这不会减少依赖项,而是将它们分组到一个结构中。必须提供一个结构值,您还需要使用相同的依赖项对其进行初始化。是的,但这样可以避免在函数中使用许多参数,我想这会使代码更具可读性。还可以想象一下,如果需要在多种情况下调用此函数:使用包装器,您只需要注入依赖项一次。