Golang 写的 web 也分 Service 和 DAO 吗?

2021-09-09 14:14:13 +08:00
 chaleaoch

python 后端出身.

第一次写 go web. 然后照着网上的开源项目抄. 我觉得 controller service Model 三层还是可以的. 毕竟业务扔到 Service 里面逻辑更清晰一些.

然后和 Java 同事请教了一下. 令我困惑的是:

user_instance.check_passwork(request.Post['password']) 

这样不行吗? 为什么一定要

1. get password from DB
2. checkpassword with request

DB.Where(map[string]interface{}{"user_id":666}).Count(&count)

这句话必须放在 DAO 层, 而不是直接在 Service 里写? 感觉好麻烦啊.

我的问题是:

  1. GO 可以更灵活吗? 更灵活一些是套路吗? 在开源项目中 / 实际商业项目中有成功案例吗?
  2. Java 分这么多层是 JavaEE 带进来的还是 Spring 带进来的? 还是谁带进来的? 没人提出过异议吗?

谢谢

11236 次点击
所在节点    Go 编程语言
57 条回复
ytll21
2021-09-10 10:54:59 +08:00
说明楼主平时不怎么写单元测试,或者在单元测试里,是把业务逻辑和持久逻辑放在一块做测试的。
onion83
2021-09-10 11:27:16 +08:00
杠精:微服务我来了!一个表一个 RPC 服务,再加一个数据组装层,完美!
zjsxwc
2021-09-10 12:08:36 +08:00
@anonydmer 2 小时 28 分钟前
基于历史缘故,我明白你的意思,
但 DAO 如果还是定义成 Data Access Object 这个理解,
那么 service 和 DAO 有什么区别呢,
只要是返回数据 Data 的对象都可以被称为 DAO,
很少存在业务代码不使用数据的,
那么按照这个理解一切皆 DAO !

我也见过,在一个 foo DAO 通过多个不同 RPC 调用别的 service 对象,这些 service 对象再通过自己的 DAO 获取数据,foo DAO 再组装这些 rpc 数据返回的合成一个数据,这时候这个 foo DAO 如果按你的理解当然可以被称为 DAO,但我更愿意称呼他为 service 。
zjsxwc
2021-09-10 12:11:10 +08:00
最后 DAO 就被滥用成 现在这种局面,什么都能往 DAO 里套,
DAO 就是神,祂无所不能!
leoskey
2021-09-10 12:15:03 +08:00
分层是为了提供系统可维护性。DAO 并不是为了可迁移到另一数据库而存在,而是在于让 Service 层更关注业务逻辑,无需关注 DAO 等底层。
brucedone
2021-09-10 12:54:02 +08:00
以前用 echo 或者 gin 的时候,常规的就三层,能 hold 的住小项目向中项目演变,后来用了 goframe,能 hold 的住小,中,大的项目需求,是否需要 dao,我感觉更多的是看需求增长量级,再好的项目架构,也没有办法适应海量的需求变化
jsuly
2021-09-10 13:12:12 +08:00
可以不考虑分层, 分模块
cassyfar
2021-09-13 04:36:33 +08:00
@zjsxwc
DAO 是去调用持久数据的,就是你服务器挂了,这些数据也会在。比如存在数据库里,存在本地磁盘文件里或者其他地方的数据。我个人理解 DAO 只是将你自己系统处理数据的逻辑,和如何存储这些数据的逻辑分离开( decouple )。这样比如你升级更换迁移数据的持久方案,也不会影响到你本身的服务。
HHAO2019
2021-09-14 09:01:22 +08:00
controller->service->manager->mapper 我这边项目是这样的 Java
chaleaochexist
2022-04-13 09:51:02 +08:00
@kxiaong #14 views.py 是 service 的话,controller 是什么?
chaleaochexist
2022-04-13 09:54:02 +08:00
chaleaochexist
2022-04-13 09:55:33 +08:00
@wfd0807 #16 大佬,我其实也一直在查这个三层架构是从哪里来的。
“service 层是 spring 项目早起设计出来的” 这个有出处吗?
chaleaochexist
2022-04-13 10:03:06 +08:00
@anonydmer #37 你说的这三点 django 中的 model 都能实现。
不过 django 中的 model 的功能 会更多一些, 譬如可能带一些 业务。 这又和 DAO 不一样了。
譬如 获取一个用户的多个 Role 这样的操作在 Java 里面 一般都在 service 里写。但是在 django 中可能就是一个 model 的方法了。
chaleaochexist
2024-03-25 13:04:58 +08:00
@zjsxwc 时隔数年在看自己的问题. 有了新的理解.
大佬请教一下 repository 和 DAO 有什么区别?

我怎么感觉都差不多呢?
除了
1. 面向领域和面向数据.
2. entity 可以带方法.

能举个例子吗?
chaleaochexist
2024-03-25 15:23:02 +08:00
@abersheeran java 写 DAO 怎么写?
DAO 绑定一个 Model?
chaleaochexist
2024-03-25 15:26:29 +08:00
@soupu626 时隔多年又回到这个问题.

你说的我有一点点理解.

但是如果是 django 来作的话, 有一点点类似于 java 中的 entity/pojo 拥有一个方法去查询数据库.
User user = new User()
user.checkpasswd()

这样子.
chaleaochexist
2024-03-25 15:32:17 +08:00
@kxiaong
"Django 的 Model 可以封装自己的 objects, 来定义通用的查询,基本等效于 java 的 DAO"
只能说基本等效, 就像其他楼说的, 如果涉及到 Redis 操作或者其他 RPC 操作, 如果自己封装一层 DAO 更清晰.
还有就是换 ORM 的时候, 如果自己封装了一层 DAO, 那么 service 层真的一点都不用动. 但是如果 django orm --> 换别的 ORM. service 层要改动的地方还是挺多的.
说白了 还是面向接口编程
"多人协作的 Django 项目中,没法确定别人写的 service 中有没有 SQL 修改或影响到你要操作的数据。出问题不好定位"
即使是使用 DAO 也无法定位有没有 SQL 修改影响你的操作啊.
譬如 user 和 permission 两张表.
我在 UserDao 中是否可以处理 Permission 这张表呢?
譬如删除 User 同时删除 Permission 这个动作是在 Service 里调用 PermissionDao 还是在 UserDAO 中直接把 permission 直接删除了? 这个有规范吗?

补充, 我是楼主, 感谢大佬的原始回复.
期待您新的回复.

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

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

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

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

© 2021 V2EX