gpt4 book ai didi

go - 用于 GO 应用程序和 mongodb 的干净和通用的项目结构

转载 作者:IT老高 更新时间:2023-10-28 13:06:55 28 4
gpt4 key购买 nike

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

  1. 关注点分离(SoC)

    • 数据模型
    • 商业实体
    • 商业服务
    • Controller
  2. 依赖注入(inject)和工作统一

  3. 单元测试
    • MoQ 或 nUnit
  4. 与 UI 框架集成
    • Angularjs 或其他
  5. 支持 SEO 的 RESTful 网址

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

enter image description here

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

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

最佳答案

这取决于你自己的风格和规则,在我公司,我们以这种方式开发我们的项目:

  • 配置是由环境变量决定的,所以我们有一个company/envs/project.sh 服务之前必须评估的文件(在图像中的项目之外)。
  • 我们添加一个 zscripts包含所有额外脚本的文件夹,例如添加用户或发布帖子。仅用于调试建议。
  • 数据模型(实体)位于一个名为 project/models 的包中.
  • 所有 Controller 和 View (HTML 模板)都归类为“应用程序”或“模块”。我们使用 REST 路径作为主组分隔符,所以路径 /dogs去包project/apps/dogs/catsproject/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")
}

模块

模块是与其他模块隔离的 View 和 Controller 的容器,使用我们的配置,我建议不要在模块之间创建依赖关系。模块也称为应用程序。

每个模块使用路由器、子路由器或您的框架提供的配置其路由,例如(文件 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")

注意:对于 View ,您可以将它们添加到 project/apps/<name>/views文件夹并使用相同的功能对其进行配置。

其他

有时我们还会添加 project/constantsproject/utils包。

这是它的样子:

Example of project structure

请注意,在上面的示例中,templates与应用程序分开,那是因为它是占位符,目录是空的。

希望它有用。来自墨西哥的问候:D.

关于go - 用于 GO 应用程序和 mongodb 的干净和通用的项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34499144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com