type
status
date
slug
summary
tags
category
icon
password
简单介绍一下项目的结构:

从左往右一层层来介绍;
1.图中TinyDance项目目录中Internal承载着项目的主要代码,逻辑;main.go用于启动项目;script目录与docker-compose.yaml文件是负责启动docker容器的,因为之前遇到过mysql放在容器中使用的case,在未来扩展时使用docker-compose将方便启动项目,故将此项目的数据库放在docker容器中,但这一部分仅做了启动docker容器,映射mysql端口的工作,具体的连接数据库任务不在这儿。
2.来看Internal包,这里的架构有点类似DDD(领域驱动设计);

domain层存放着业务对象,web层service层repository层这三层,遵循着从上往下的结构,web负责相关的web工作,处理用户(前端)传过来的东西,如:初始化webserver,定义项目组织方给我们的接口等;service层是我们这个项目具体的业务逻辑所在地,也就是说前面我们写的接口,是要调用service具体逻辑的;repository层负责具体的存储逻辑,也就是说,如果service层某一个业务逻辑需要用到存储,那该业务逻辑需要调用repository层下的存储逻辑,比如调用repository/user.go中的创建逻辑等等;
repository层下还有一个dao的文件夹,存放着具体的数据库操作(还有具体的文件操作),也就是说,我们之前在repository/user.go中写的那个创建函数,其内部需要调用dao文件夹下user.go中的具体数据库实现,比如使用gorm框架调用其给予的相关API;
对于这个从上到下的结构。我们综合起来,打个比方,我现在注册用户,项目组织方给我们的那个API接口,我们在web层实现,其内部需要调用我们具体的业务逻辑-即signup功能,这个在service层,这个signup内部要调用存储逻辑,暂时叫他create,在repository层实现,其内部具体调用gorm框架所提供给我们的数据库操作,这个放在到层之下。
dao层的init用于建表,web层的init_web用于注册路由。
乍一看,这样的结构层次多,且复杂,但却能有效减少耦合性,而且对于复杂的项目,这样的结构可以帮助我们快速定位,快速清除大致开发流程。
最后注意:
代码应符合 面向接口编程 风格,举个例子,service层的user.go文件,存放着与user相关的业务逻辑,我们首先要定义一个结构体,同时手动用一个初始化函数完成依赖注入,进行这个结构体的初始化:
其中,结构体包含的repo变量,经过前面的架构分析,你应该清楚,这是为了方便调用repository的东西;
接着这个例子,我们初始化完结构体后,就可以定义这个结构体的方法,也就是和user有关的业务逻辑了,比如注册逻辑:
我们可以看到,这个函数中最后会调用repo的某一个函数,并将结果(error信息)返回,而经过前面的分析,你清楚,这个repo.create函数内部也会调用dao层相关的函数,也就是gorm给我们的API。
我们之前的那几层,从上到下,web,service,repository,dao,每一层仅仅能调用下一层所提供的功能,不能跨层,也不能调用上一层的信息。
关于错误的处理,除了初始化部分用panic,其余一律使用fmt+return形式处理。
关于加密数据所在的位置,本项目初定在service层,对前端传过来的数据做加密。
未完待续…
- 作者:Alex
- 链接:https://nextme.one/wureny.eth/article/tinydanceddd
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。