我想使用GO和MongoDB构建一个基于API的应用程序.我来自Asp.net MVC背景.可能如果我使用MVC Web应用程序构建一个需要考虑的东西
关注点分离(SoC)
的DataModel
BusinessEntities
商业服务
控制器
Dependeny注射与工作的统一
单元测试
MoQ或nUnit
与UI框架集成
Angularjs或其他人
支持SEO的RESTful网址
以下架构可以解决我在基于MVC的应用程序中的需求
Web上有资源来构建基于Asp.Net或Java的应用程序,但我还没有找到Golang应用程序架构的解决方案.
是GO与C#或Java不同,但仍然有Structs,Interfaces来创建可重用的代码和通用的应用程序架构.考虑以上几点,我们如何在GO应用程序中创建一个干净且可重用的项目结构,以及如何在DB(Mongodb)事务中创建一个通用的存储库.任何网络资源也是一个很好的起点.
这取决于你自己的风格和规则,在我的公司,我们以这种方式开发我们的项目:
配置由环境变量决定,因此我们有一个company/envs/project.sh
必须在服务之前评估的文件(在图像中的项目之外).
我们添加一个zscripts
包含所有额外脚本的文件夹,例如添加用户或发布帖子.仅用于调试建议.
数据模型(实体)位于一个名为的包中project/models
.
所有控制器和视图(HTML模板)都分为"应用程序"或"模块".我们使用REST路径作为主要组分隔符,因此路径/dogs
将转到package project/apps/dogs
和/cats
to project/apps/cats
.
管理人员在项目的根目录中处于独立的包中project/manager
.
静态文件(.css,.png,.js等)位于project/static/[app/]
.有时需要具有可选[app/]
文件夹,但只有当两个应用程序具有仪表板或冲突的文件名时才会发生.大多数情况下,您不需要使用[app/]
静态资源.
经理
我们称一个管理器,一个包含纯函数的包,可以帮助应用程序执行其任务,例如数据库,缓存,S3存储等.我们package.Startup()
在开始监听之前初始化每个管理器调用,并package.Finalize()
在程序中断时完成调用.
经理的一个例子可能是project/cache/cache.go
:
type Config struct { RedisURL string `envconfig:"redis_url"` } var config Config var client *redis.Client func Startup(c Config) error { config = c client, err := redis.Dial(c.RedisURL) return err } func Set(k,v string) error { return client.Set(k, v) }
在main.go(或your_thing_test.go)中:
var spec cache.Config envconfig.Process("project", &spec) cache.Startup(spec)
在应用程序(或模块)中:
func SetCacheHandler(_ http.ResponseWriter, _ *http.Request){ cache.Set("this", "rocks") }
模块
模块是与其他模块隔离的视图和控制器的容器,使用我们的配置,我建议不要在模块之间创建依赖关系.模块也称为应用程序.
每个模块使用路由器,子路由器或框架提供的路由配置其路由,例如(文件project/apps/dogs/configure.go
):
func Configure(e *echo.Echo) { e.Get("/dogs", List) }
然后,所有处理程序都存在于project/apps/dogs/handlers.go
:
// List outputs a dog list of all stored specimen. func List(c *echo.Context) error { // Note the use of models.Xyz var res := make([]models.Dog, 0) // A little trick to not return nil. err := store.FindAll("dogs", nil, &res) // Call manager to find all dogs. // handle error ... return c.JSON(200, res) // Output the dogs. }
最后,您在main(或测试)中配置应用程序:
e := echo.New() dogs.Configure(e) // more apps e.Run(":8080")
注意:对于视图,您可以将它们添加到project/apps/
文件夹并使用相同的功能对它们进行配置.
其他
有时我们还会添加project/constants
一个project/utils
包和一个包.
这是它的样子:
请注意,在上面的示例中,templates
它们与应用程序分开,因为它的占位符目录为空.
希望它有用.来自墨西哥的问候:D.