为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
四季花海 2021-11-29 19:34:52
我想使用 GO 和 MongoDB 构建一个基于 API 的应用程序。我来自 Asp.net MVC 背景。可能如果我使用 MVC Web 应用程序构建架构,需要考虑的是关注点分离(SoC)数据模型商业实体商业服务控制器依赖注入和工作统一单元测试最小起订量或 nUnit与 UI 框架集成Angularjs 或其他支持 SEO 的 RESTful url下面的架构可能是我对基于 MVC 的应用程序的需求的解决方案网络上有资源可以构建基于 Asp.Net 或 Java 的应用程序,但我还没有找到 Golang 应用程序架构的解决方案。是的,GO 与 C# 或 Java 不同,但仍然有用于创建可重用代码的结构、接口和通用应用程序架构。考虑以上几点,我们如何在 GO 应用程序中创建一个干净且可重用的项目结构以及一个用于 DB(Mongodb)事务的通用存储库。任何网络资源也是一个很好的起点。
查看完整描述

3 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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

  • 配置由环境变量决定,因此我们有一个company/envs/project.sh文件,必须服务之前对其进行评估(在图像中的项目之外)。

  • 我们添加一个zscripts包含所有额外脚本的文件夹,例如添加用户或发布帖子。仅用于调试建议。

  • 数据模型(实体)位于名为project/models.

  • 所有控制器和视图(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")

}

模块


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


每个模块都使用路由器、子路由器或您的框架提供的内容来配置其路由,例如 (file 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.

}

最后,您在主(或测试)中配置应用程序:


e := echo.New()

dogs.Configure(e)

// more apps


e.Run(":8080")

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


其他


有时我们还会添加一个project/constants和一个project/utils包。


这是它的样子:

//img1.sycdn.imooc.com//61a4bb0d000164db01750680.jpg

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

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


查看完整回答
反对 回复 2021-11-29
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

我已经在 golang 中构建 Web API 有一段时间了。

你必须做一些研究,但我可以给你一些起点:

  1. 使用 Go 构建 Web 应用程序-- 电子书

  2. github.com/julienschmidt/httprouter——用于路由地址

  3. github.com/unrolled/render/——用于渲染各种形式的响应(JSON、HTML 等)

  4. github.com/dgrijalva/jwt-go -- JSON 网络令牌

  5. www.gorillatoolkit.org/pkg/sessions -- 会话管理

以及一些事情最终如何协同工作的参考:

Go Web API Repo -- 个人项目


查看完整回答
反对 回复 2021-11-29
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

过去我也一直在为如何构建我的 Go Web API 而苦苦挣扎,但我不知道任何 Web 资源可以准确地告诉您如何编写 Go Web API。

我所做的只是查看 Github 上的其他项目,并尝试他们如何构建代码,例如,Docker 存储库在其 API 上有非常符合实际的 Go 代码。

此外,Beego是一个 RESTful 框架,它以 MVC 方式为您生成项目结构,根据他们的文档,它也可以用于 API。


查看完整回答
反对 回复 2021-11-29
  • 3 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信