【发布时间】:2016-03-09 16:28:11
【问题描述】:
我正在将一个大型 Web 应用程序移植到 Go。为了管理复杂性并提高可测试性,我们采用了面向服务的架构。我正在尝试找出最清晰的方法来命名和构建包,这样任何服务都不知道其他服务的实现,并且我可以在应用程序级别将它们区分开来。请允许我举个例子:
FooService
package api
type FooService interface {
foo()
}
FooService 实现
package implementation
import (
"fmt"
_ "github.com/user/foo/api"
)
type FooImplementation struct {
}
func (self FooImplementation) foo() {
fmt.Println("foo")
}
在我的应用程序中,我需要将此实现绑定到接口以及许多其他接口。但它们不能都被命名为 api/implementation。我是否也将包命名为 fooapi 和 fooimplementation?或者有没有更好的方法来构建我的应用程序? 谢谢!
【问题讨论】:
-
如果服务和实现在同一个包
github.com/user/foo中会有什么问题?您仍然可以在其他包或测试中提供不同的实现吗?并非所有最佳实践都来自例如Java 延续到 Go。 -
还可以看看 golang.org/x/oauth2 是如何组织的。
-
只需将您的 API 和实现放在同一个包中,只导出公共 API 中的标识符。
-
Aedolon - 这就是我现在正在做的事情。我将 foo 服务和实现都作为 foo 包的一部分,然后对于服务,我将导入“github.com/user/foo/api”,但对于我需要两者的包,例如main,我会在导入时重命名它们。