新手提问: gin+gorm 中大型项目分层问题

2020-09-04 16:15:31 +08:00
 mzmxcvbn
最近在看 gin,感觉对中大型项目的结构规划有点模糊。
在 github 上看了一些例子,按我现在的理解分层:

controller -- 请求入口,参数校验,调用 server,返回错误或响应
server -- 接收已验证参数,实现具体业务逻辑,调用 dao,返回结果
dao -- 所有与数据库相关的操作
model -- 定义 struct 以用于 orm 映射

不知道我的理解是否正确,同时,我还有下面一些疑惑:
1:dao 层的作用?我在网上看的例子有一些有 dao 层,同时也有很大一部分没有这层,server 层的代码中直接调用 orm 增删改查的方法。如果 server 中每次要用到数据库的地方甚至只是参数稍有不同,就要在 dao 中写一个对应的函数,岂不是会很繁琐。而且我觉得对于像 CreateTag 这种简单方法,orm 也是直接一行语句就能实现,再单独包 dao 这一层他的优势是什么。
2:server 层的写法?我现在的理解是有几个 controller 就要写几个对应的 server,比如有 CreateTag, ListTag, UpdateTag, DeleteTag, CreatePost, ListPost, UpdatePost, DeletePost 这 8 个 controller 是不是就要写 8 个对应的 server,那拆分出 server 层的目的仅仅就是不让业务逻辑都堆在 controller 吗,我在网上有看到说 server 层可以重用代码,但这样每加一个 controller 就要加一个 server 的,该怎么体现重用

刚看完代码,脑子有点乱,还希望有大神能解答我的疑惑
7438 次点击
所在节点    Go 编程语言
27 条回复
EminemW
2020-09-05 19:21:28 +08:00
如果分 controller 跟 service 的话,controller 层做参数校验
mzmxcvbn
2020-09-07 11:08:09 +08:00
@lix7 谢谢回复!我还想请教一下有关 dao 层的问题:1.如果后续项目除了 mysql 还要用到 mongodb 或者 redis 的话,是不是相关操作也都放在 dao 层。2.dao 层里具体实现是对每一个 model 都要写自己的 list 、load 、save 函数吗,而且对与 list,我可能会有好多地方用到,但参数条件可能都不同,比如有些要多个 where,有些要 order by,有些要 limit,这是不是每用到一个不一样的,虽然都是 list,但都要再加一个函数?
lix7
2020-09-07 18:59:26 +08:00
@mzmxcvbn
1. 都放在一层 dao 里,叫什么不重要,重要的这层只负责数据的加载和保存,你只需要调用标准接口,不需要关心存储细节;
2. 从 DDD 的角度来讲,每一个聚合根对应一个 DAO ( DDD 里叫 repository )。但如果只从分层角度来考虑的话,是的,每一个 model 对应一个 dao ;
3. 对于 list 接口,你自己已经提到了,where/order by/limit 都只是“参数条件”,所以他们只是一个大接口的参数而已,这个接口的基础功能,就只是 list,至于怎么 list 、list 多少个东西出来、顺序是啥样的,只是参数而已
rita413413
2020-12-11 07:42:17 +08:00
@basefas 多谢😊
joseph1994
2021-04-21 10:00:41 +08:00
上面有些人是不是有点偏激啊,不清楚这样分层有啥大毛病,MVC 从来就不是 Java 的专利和代名词...为啥称之为“Java 的坏毛病”?再说论工程化的话,Java 有很多东西是 Go 要学的,我虽然喜欢 Go,但是真不想和这群人为伍
waibunleung
2021-05-27 19:32:47 +08:00
@mzmxcvbn 我有了同样的疑问,看这个帖子还是没有很好地得到解决呀...题主方便交流一下吗?
pennai
2022-03-07 20:15:34 +08:00
上面太偏激了吧,软件工程的东西,怎么扯上 java 就叫“坏毛病”了呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX