PhalGo-ADM思想

简介:

PhalGo-ADM思想

关于ADM思想主要是指在API开发中使用API,Domain和Model三层结构,PhalGo从PhalApi中学习并且推崇这种设计模式,这种模式的好处在于分工明确,业务复用,数据复用可以减少复杂业务重复的代码量,很多框架关心性能,而不关心人文;很多项目关心技术,而不关注业务。ADM设计就是从业务的角度出发建立的开发规范.

ADM分工协作

Api

Api层可以理解为是请求开始结束以及组合业务的地方,主要负责以下几件事情:

  1. 获取请求参数并且验证请求参数的有效性
  2. 对Domain领域层的实现进行拼接来组成整个接口的业务
  3. 对于返回结果进行处理

我们可以看一个获取用户详情接口的例子:

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接口层不应该做:

  • 不应该:进行业务规则的处理或者计算
  • 不应该:关心数据是否使用缓存,或进行缓存相关的直接操作
  • 不应该:直接操作数据库
  • 不应该:将多个接口合并在一起

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。而应该是上层调用下层,或者同层级调用,也就是说,我们应该:

  • Api层调用Domain层
  • Domain层调用Domain层
  • Domain层调用Model层
  • Model层调用Model层

为了更明确调用的关系,以下调用是 错误 的:

  • 错误的做法1:Api层直接调用Model层
  • 错误的做法2: Domain层调用Api层,也不应用将Api层对象传递给Domain层
  • 错误的做法3: Model层调用Domain层

这样的约定,便于我们形成统一的开发规范,降低学习维护成本。

比如需要添加缓存,我们知道应该定位到Model层数据源进行扩展;若发现业务规则处理不当,则应该进入Domain层探其究竟;如果需要对接口的参数进行调整,即使是新手也知道应该找到对应的Api文件进行改动。

相关文章
|
JavaScript 前端开发 API
uniapp的优势与劣势
uniapp的优势与劣势
504 1
|
运维 Cloud Native 云计算
云端新篇章:云原生技术的崛起与影响
本文旨在深入探讨云原生技术的概念、特点及其在现代信息技术领域中的应用和影响。通过对云原生技术的详细解析,本文将揭示这一新兴技术如何推动企业数字化转型,以及它对未来软件开发、部署和运维模式的潜在变革。不同于传统的云计算模式,云原生技术以其独特的优势,正在重塑IT行业的格局。
278 7
|
9月前
|
人工智能 搜索推荐
AI视频技术的发展是否会影响原创内容的价值
AI视频技术的发展显著降低了视频制作的门槛与成本,自动完成剪辑、特效添加等繁琐工作,大大缩短创作时间。它提供个性化创意建议,帮助创作者突破传统思维,拓展创意边界。此外,AI技术使更多非专业人士也能参与视频创作,注入新活力与多样性,丰富了原创内容。总体而言,AI视频技术不仅提升了创作效率,还促进了视频内容的创新与多样化。
|
安全 网络安全 数据安全/隐私保护
智能家居安全:如何保护你的家庭免受网络威胁
在这篇技术性文章中,我们将深入探讨智能家居设备的安全性问题。随着越来越多的家庭采用智能技术,确保这些设备免受网络攻击变得至关重要。文章将涵盖常见的安全风险、预防措施以及如何应对潜在的网络威胁,以帮助读者保护自己的家庭网络安全。
|
传感器 安全 物联网
蓝牙5.0:革新无线通信的新时代
蓝牙5.0:革新无线通信的新时代
672 12
|
11月前
|
Kubernetes Cloud Native 云计算
深度挖掘:云计算平台在数字化转型中的核心作用
【10月更文挑战第29天】作为一名技术博主,我深入探讨了云计算平台在数字化转型中的核心作用。本文分析了云计算的弹性、可扩展性和高可用性如何帮助企业快速适应市场变化,降低成本并提高效率。同时,文章介绍了云计算在创新加速、业务连续性和灾难恢复方面的优势,并通过实际案例展示了其在企业数字化转型中的应用。
337 0
|
缓存 数据处理 UED
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
【5月更文挑战第17天】在 Uniapp 开发中,解决页面间数据传递、网络请求异常、屏幕适配及性能优化等问题至关重要。利用路由参数传递复杂数据,如`uni.navigateTo`和`JSON.stringify`;处理网络请求异常时,添加错误处理机制增强健壮性;使用响应式设计和缓存策略优化布局和性能。针对组件问题,需排查依赖和配置,而平台差异则需定制化处理。通过不断学习和实践,提升开发技能,确保项目成功实施。
276 2
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
|
Linux 数据安全/隐私保护
在Linux中,如何添加一个用户到特定的组?
在Linux中,如何添加一个用户到特定的组?
|
搜索推荐 项目管理 开发工具
odoo是啥
【6月更文挑战第23天】odoo是啥
697 3
|
存储 关系型数据库 数据库
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?
迎峰而上:汇联易依托阿里云RDS通用云盘,加速业务智能化升级
超1/3中国500强企业都在用的「汇联易」,为什么选用阿里云RDS?