猿问

GO 应用程序和 mongodb 的清洁通用项目结构

我想使用 GO 和 MongoDB 构建一个基于 API 的应用程序。我来自 Asp.net MVC 背景。可能如果我使用 MVC Web 应用程序构建架构,需要考虑的是

  1. 关注点分离(SoC)

    • 数据模型

    • 商业实体

    • 商业服务

    • 控制器

  2. 依赖注入和工作统一

  3. 单元测试

    • 最小起订量或 nUnit

  4. 与 UI 框架集成

    • Angularjs 或其他

  5. 支持 SEO 的 RESTful url

下面的架构可能是我对基于 MVC 的应用程序的需求的解决方案

网络上有资源可以构建基于 Asp.Net 或 Java 的应用程序,但我还没有找到 Golang 应用程序架构的解决方案。

是的,GO 与 C# 或 Java 不同,但仍然有用于创建可重用代码的结构、接口和通用应用程序架构。考虑以上几点,我们如何在 GO 应用程序中创建一个干净且可重用的项目结构以及一个用于 DB(Mongodb)事务的通用存储库。任何网络资源也是一个很好的起点。


四季花海
浏览 200回答 3
3回答

翻过高山走不出你

这取决于你自己的风格和规则,在我公司,我们是这样开发项目的:配置由环境变量决定,因此我们有一个company/envs/project.sh文件,必须在服务之前对其进行评估(在图像中的项目之外)。我们添加一个zscripts包含所有额外脚本的文件夹,例如添加用户或发布帖子。仅用于调试建议。数据模型(实体)位于名为project/models.所有控制器和视图(HTML 模板)都归类为“应用程序”或“模块”。我们使用REST路径为主要组分隔符,所以路径/dogs去包装project/apps/dogs和/cats到project/apps/cats。管理器位于项目根目录下的单独包中project/manager。静态文件(.css、.png、.js 等)位于project/static/[app/].&nbsp;有时需要具有可选[app/]文件夹,但仅当两个应用程序具有仪表板或文件名冲突时才会发生。大多数情况下您不需要使用[app/]静态资源。经理我们称之为管理器,一个包含帮助应用程序执行其任务的纯函数的包,例如数据库、缓存、S3 存储等。我们package.Startup()在开始侦听之前初始化每个管理器调用,并package.Finalize()在程序中断时完成调用。经理的一个例子可能是project/cache/cache.go:type Config struct {&nbsp; &nbsp; RedisURL string `envconfig:"redis_url"`}var config Configvar client *redis.Clientfunc Startup(c Config) error {&nbsp; &nbsp;config = c&nbsp; &nbsp;client, err := redis.Dial(c.RedisURL)&nbsp; &nbsp;return err}func Set(k,v string) error {&nbsp; &nbsp;return client.Set(k, v)}在 main.go(或 your_thing_test.go)中:var spec cache.Configenvconfig.Process("project", &spec)cache.Startup(spec)在应用程序(或模块)中:func SetCacheHandler(_ http.ResponseWriter, _ *http.Request){&nbsp; &nbsp;cache.Set("this", "rocks")}模块模块是与其他模块隔离的视图和控制器的容器,使用我们的配置,我建议不要在模块之间创建依赖项。模块也称为应用程序。每个模块都使用路由器、子路由器或您的框架提供的内容来配置其路由,例如 (file project/apps/dogs/configure.go):func Configure(e *echo.Echo) {&nbsp; &nbsp; e.Get("/dogs", List)}然后,所有处理程序都住在project/apps/dogs/handlers.go:// List outputs a dog list of all stored specimen.func List(c *echo.Context) error {&nbsp; &nbsp; // Note the use of models.Xyz&nbsp; &nbsp; var res := make([]models.Dog, 0) // A little trick to not return nil.&nbsp; &nbsp; err := store.FindAll("dogs", nil, &res) // Call manager to find all dogs.&nbsp; &nbsp; // handle error ...&nbsp; &nbsp; return c.JSON(200, res) // Output the dogs.}最后,您在主(或测试)中配置应用程序:e := echo.New()dogs.Configure(e)// more appse.Run(":8080")注意:对于视图,您可以将它们添加到project/apps/<name>/views文件夹并使用相同的功能对其进行配置。其他有时我们还会添加一个project/constants和一个project/utils包。这是它的样子:请注意,在上面的示例中,templates与应用程序分开,那是因为它是占位符,目录为空。希望它有用。来自墨西哥的问候:D。

拉莫斯之舞

我已经在 golang 中构建 Web API 有一段时间了。你必须做一些研究,但我可以给你一些起点:使用 Go 构建 Web 应用程序-- 电子书github.com/julienschmidt/httprouter——用于路由地址github.com/unrolled/render/——用于渲染各种形式的响应(JSON、HTML 等)github.com/dgrijalva/jwt-go -- JSON 网络令牌www.gorillatoolkit.org/pkg/sessions -- 会话管理以及一些事情最终如何协同工作的参考:Go Web API Repo&nbsp;-- 个人项目

ABOUTYOU

过去我也一直在为如何构建我的 Go Web API 而苦苦挣扎,但我不知道任何 Web 资源可以准确地告诉您如何编写 Go Web API。我所做的只是查看 Github 上的其他项目,并尝试他们如何构建代码,例如,Docker 存储库在其 API 上有非常符合实际的 Go 代码。此外,Beego是一个 RESTful 框架,它以 MVC 方式为您生成项目结构,根据他们的文档,它也可以用于 API。
随时随地看视频慕课网APP

相关分类

Go
我要回答