服务(Service)


    • 保持 Controller 中的逻辑更加简洁。
    • 将逻辑和展现分离,更容易编写测试用例,测试用例的编写具体可以查看这里
    • 复杂数据的处理,比如要展现的信息需要从数据库获取,还要经过一定的规则计算,才能返回用户显示。或者计算完成后,更新到数据库。
    • 第三方服务的调用,比如 GitHub 信息获取等。

    每一次用户请求,框架都会实例化对应的 Service 实例,由于它继承于 ,故拥有下列属性方便我们进行开发:

    • this.ctx: 当前请求的上下文 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
    • this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
    • this.service:应用定义的 ,通过它我们可以访问到其他业务层,等价于 this.ctx.service
    • this.config:应用运行时的配置项
    • 发起网络调用。
    • this.ctx.service.otherService 调用其他 Service。
    • this.ctx.db 发起数据库调用等, db 可能是其他插件提前挂载到 app 上的模块。
    • Service 文件必须放在 app/service 目录,可以支持多级目录,访问的时候可以通过目录名级联访问。

    • Service 需要通过 Class 的方式定义,父类必须是 egg.Service
    • Service 不是单例,是 请求级别 的对象,框架在每次请求中首次访问 时延迟实例化,所以 Service 中可以通过 this.ctx 获取到当前请求的上下文。

    下面就通过一个完整的例子,看看怎么使用 Service。