MVC 框架念叨了千百遍,但是对于它的理解还是停留在概念上。
作为一种经典架构设计典范,MVC 在日新月异的软件行业却能常青数十年,一定有其独特的魅力。
一、Dao 层和 Service 层的概念
Dao 是 Data Access Object (数据访问对象)的缩写,从其名字就能看出它肯定和操作数据库相关。
Service 就是服务,从名字判断它应该比 Dao 层的抽象程度更高,但它也和数据操作相关。
二、都是操作数据,为什么需要加一层?
2.1 分工不同
Dao 层称为数据访问层,它主要涉及一些底层的、基础的数据库操作,具体到一个表就是对 Entity(实体)的 CRUD(增删改查)。
Service 层称为服务层,它专注于业务逻辑,而其中对数据库的操作则需要借助 Dao 层实现,可以认为将几种操作组合起来实现业务。
Dao 层是底层,具体到对某一张表的 CRUD,可以简单理解为有多少张表就有多少个 Dao 层。
而 Service 层可以理解为是 Dao 层的老板,通过 Service 层控制 Dao 层来实现业务逻辑。
一个 Service 层可以控制一个或者多个 Dao 层。
2.2 代码解耦
随着项目逐渐庞大,代码解耦必须提上日程。
Dao 层只负责执行 SQL 语句,具体到某一张表的增删查改。保证 Dao 层无误,Service 层就能安心关注业务逻辑。
日后进行代码迭代或项目结交时,新人也能快速上手。
当然对于一些小项目不用 Service 也是可以的,业务逻辑简单,只用 Dao 足矣。
At Last
也许理论说起来枯燥,但它确实是对实战的有效总结。从一个项目的目录结构就能看出程序员的水平。
三、GoFrame 的一些实现
3.1 gf gen dao
gf gen dao
是 GoFrame 的一个生产力工具,dao 命令是 CLI 中最频繁使用、也是框架设计的工程规范能否准确落地的关键命令。
该命令用于生成 dao
数据访问对象、do
数据转化模型及 entity
实例数据模型的 Go 代码文件。由于该命令的参数、选项较多,官方推荐使用配置文件来管理生成规则。
gf gen dao 的基本原理是,根据数据库中已存在的表结构,来自动生成 dao、do 和 entity。
这部分代码的开发通常很琐碎且程式化,有了这个工具,程序员就能专注于上层业务逻辑开发。
其中一些常用参数如下:
- -p, –path 表示生成文件(dao、do …)存放的目录
- -l, –link 表示数据库的配置,如
-l "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
- -t, –tables 表示仅为给定表生成模型,多个表名用 “,” 分隔开,如
-t user,products
- -g, –group 表示为生成的 ORM 实例指定数据库的配置组名称,不是必须的,默认值为“default”。
3.2 如何解耦 dao 和 service
在 dao 层创建基本的 CRUD方法与数据库交互,包括 Create()、Reterive()、Update() 和 Delete(),其中 Reterive 可用 Get 替换。
在 dao 层提供基本方法的基础上,service 调用 dao 层的方法实现业务逻辑或逻辑较为复杂的基本操作。如一个表为 permModule
,那么通过 gf gen dao
生成的是
// =================================================================================// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.// =================================================================================package daoimport (...)// internalPermModuleDao is internal type for wrapping internal DAO implements.type internalPermModuleDao = *internal.PermModuleDao// permModuleDao is the data access object for table perm_module.// You can define custom methods on it to extend its functionality as you wish.type permModuleDao struct {internalPermModuleDao}var (// PermModule is globally public accessible object for table perm_module operations.PermModule = permModuleDao{internal.NewPermModuleDao(),})// Fill with you ideas below.
在 // Fill with you ideaas below.
下面创建 CRUD 方法,然后 service 层通过 dao.PermModule.Create()
调用这些方法。