我有一个用Go编写的小型Web应用程序。它是为更大的系统创建的基础,我希望它可以扩展,可以添加/删除组件,而无需以任何方式修改此基础。
目前的结构是:
App
Modules
Core
... Core Files Here ...
app.go
main.go
app.go将包含一个路由方法,该方法应该接受Web请求,并根据请求路径知道哪个模块负责处理请求。每个模块/组件都有其控制器。
每个组件都有自己的包名,所以我认为这是不可能的,因为强制显式导入。
例如,我可以添加一个名为say blog的新模块/组件,例如:
App
Modules
Core
... Core Files Here ...
controller.go
Blog
... Blog Files Here ...
controller.go
app.go
main.go
答案 0 :(得分:3)
有几种方法可以实现您的目标。由于Go目前不支持动态加载的库,因此您需要在添加/删除任何组件时重新编译应用程序。因此,最简单的方法是yourapp/core
包,其中包含以下内容:
Application
类型,其中ServeHTTP
方法充当您的主要应用Component
接口。您可能希望在那里添加BaseUrl() string
和ServeHTTP
方法。Register
类型的Application
方法,可用于向您的应用添加新组件。然后,您的组件可以在单独的包中实现(例如yourapp/blog
),它们可能取决于您的yourapp/core
包。
唯一需要“用户可编辑”的是main.go
文件,它可能如下所示:
func main() {
app := core.NewApplication()
app.Register(blog.Blog{
Title: "My Personal Blog",
})
app.Register(...)
app.Run()
}
另一种方法可能是为组件定义RPC接口(可能包括RegisterComponent
,UnregisterComponent
和GetGlobalConfig
等函数。
然后,您可以在单独的进程中运行这些组件,这些进程的优点是您可以动态地启动/停止/重新加载这些组件,并且它们不会破坏您的主应用程序。如果您想使用此方法,请查看net/rpc包,甚至httputil.NewSingleHostReverseProxy。