#PhalGo-ADM思想数据库
关于ADM思想主要是指在API开发中使用API,Domain和Model三层结构,PhalGo从PhalApi中学习而且推崇这种设计模式,这种模式的好处在于分工明确,业务复用,数据复用能够减小复杂业务重复的代码量,**不少框架关心性能,而不关心人文;不少项目关心技术,而不关注业务。**ADM设计就是从业务的角度出发创建的开发规范.设计模式
##ADM分工协做缓存
###Api框架
Api层能够理解为是请求开始结束以及组合业务的地方,主要负责如下几件事情:函数
咱们能够看一个获取用户详情接口的例子:性能
func (this *User_Api)GetUserInfo() echo.HandlerFunc { return func(c echo.Context) error { Request := phalgo.Requser{Context:c} Response := phalgo.Response{Context:c} defer Request.ErrorLogRecover() //获取请求参数 id := Request.GetParam("id").GetInt() //拼接领域层业务 user, err := this.Domain.User.GetUserInfo(id) if err != nil { return Response.RetError(err, 400) } //返回结果 return Response.RetSuccess(user) } }
(1)Api接口层应该作:学习
(2)Api接口层不该该作:this
###Domain设计
Domain能够称之为领域层,是ADM(Api-Domain-Model)分层中的桥梁,主要负责处理业务规则。Domain层存在的目录是为了把复杂业务拆分红一个一个小模块而后组织起来实现复杂的业务,从而达到代码复用,拆分复杂业务的做用.日志
####举个栗子
**场景:**咱们在传统MVC开发的时候,使用控制器来处理业务,咱们可能会写不少的重复代码来验证用户提交的信息是否ok,好比完善信息的时候验证邮箱,在修改用户信息的时候也要验证修改的邮箱,在管理的时候去编辑一个用户的时候也可能在去验证邮箱,这个时候咱们的验证逻辑代码已经重复写在了3个地方,若是有一个需求加入了电话号码,那么你须要在3个地方加上对电话号码的验证逻辑
场景一并不难以遇到,并且在复杂的业务状况下重复使用的业务逻辑会更多,若是咱们使用了Domain来处理用户修改前的验证那么咱们只须要修改这个验证逻辑加上对电话号码的验证,那么全部须要验证用户信息的地方就会所有生效,而不用去作重复的工做而且避免遗漏的风险
下面是咱们获取User详情的Domain层的实现,它不单单只是能够用在获取用户详情也能够用来验证用户ID是否有效,增长代码复用性减小修改代价
func (this *Domain_User)GetUserInfo(id int)(Model.User,error) { user, err := this.Model.User.GetInfoById(id) if err != nil { return user, errors.New("UserInfo There is no") } return user,nil }
一个函数若是超过了一屏那将会影响到阅读者的理解,使用领域层拆分笨重的业务能够很好的解决这个问题
###Model
Model层想必不用说了,就是和数据库通信获取数据,Model层是单纯的不带任何业务只是简单的获取数据库数据,咱们看一段Model层代码:
type User struct { Id int `gorm:"column:aId"` Name string `gorm:"column:name"` Passwd string `gorm:"column:passwd"` Email string `gorm:"column:email"` } func (User) TableName() string { return "user" } func (this *User)GetInfoById(id int) (User, error) { User := User{} err := phalgo.GetORM().Where("id = ?", id).First(&User).Error return User, err }
注意:Model层只应该获取数据而后结束关于没有获取到数据,获取出错等状况抛出到Domain层进行处理,这样能够增长灵活性,好比经过用户名是否重复和经过用户名称获取ID,一个返回存在才算异常,一个返回不存在才算异常,具体更具业务不一样体现也不一样,因此Model层处理并不合适
##层级调用的顺序
总体上讲根据从Api接口层、Domain领域层再到Model数据源层的顺序进行开发。
在开发过程当中,须要注意不能越层调用也不能逆向调用,即不能Api调用Model。而应该是上层调用下层,或者同层级调用,也就是说,咱们应该:
为了更明确调用的关系,如下调用是 错误 的:
这样的约定,便于咱们造成统一的开发规范,下降学习维护成本。
好比须要添加缓存,咱们知道应该定位到Model层数据源进行扩展;若发现业务规则处理不当,则应该进入Domain层探其究竟;若是须要对接口的参数进行调整,即便是新手也知道应该找到对应的Api文件进行改动。