我有一个用Go编写的小型web应用程序。它是为更大的系统创建的基础,我希望它是可扩展的,可以在不需要以任何方式修改这个基础的情况下添加/删除组件。
该结构当前为:
App
Modules
Core
... Core Files Here ...
app.go
main.goapp.go将包含一个路由方法,该方法应接受web请求,并根据请求路径知道哪个模块负责处理请求。每个模块/组件都有其on控制器。
每个组件都有自己的包名,所以我认为这是不可能的,因为go会强制显式导入。
例如,我可能会添加一个名为“博客”的新模块/组件,例如:
App
Modules
Core
... Core Files Here ...
controller.go
Blog
... Blog Files Here ...
controller.go
app.go
main.go发布于 2013-08-10 03:37:08
有几种方法可以实现你的目标。由于Go目前不支持动态加载库,因此每当您添加/删除任何组件时,都可能需要重新编译您的应用程序。因此,最简单的方法是包含以下内容的yourapp/core包:
ServeHTTP方法的Application类型,它充当您的主应用程序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。
https://stackoverflow.com/questions/18153971
复制相似问题