当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《GO应用程序和mongodb的清洁和通用项目结构》经验,为你挑选了1个好方法。

我想使用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)事务中创建一个通用的存储库.任何网络资源也是一个很好的起点.



1> Cedmundo..:

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

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

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

数据模型(实体)位于一个名为的包中project/models.

所有控制器和视图(HTML模板)都分为"应用程序"或"模块".我们使用REST路径作为主要组分隔符,因此路径/dogs将转到package project/apps/dogs/catsto 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//views文件夹并使用相同的功能对它们进行配置.

其他

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

这是它的样子:

项目结构示例

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

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有