定义Service

Service的定义方式与EggJS一致

src/suite-vendor/test-party/modules/test-party/backend/src/service/party.js

  1. 1module.exports = app => {
  2. 2
  3. 3 class Party extends app.Service {
  4. 4
  5. 5 async types() {
  6. 6 const items = await this.ctx.model.partyType.select();
  7. 7 return items.map(item => {
  8. 8 return {
  9. 9 id: item.id,
  10. 10 name: this.ctx.text(item.name),
  11. 11 };
  12. 12 });
  13. 13 }
  14. 14
  15. 15 }
  16. 16
  17. 17 return Party;
  18. 18};

注册Service

与EggJS不同之处:EggJS约定了Service的文件位置,在系统启动时自动加载。而EggBornJS的Service需要通过require显式注册,从而便于进行模块编译

src/suite-vendor/test-party/modules/test-party/backend/src/services.js

  1. 1const party = require('./service/party.js');
  2. 2
  3. 3module.exports = app => {
  4. 4 const services = {
  5. 5 party,
  6. 6 };
  7. 7 return services;
  8. 8};

通过services.js注册的Service,系统会自动注册为Bean组件,并有如下约定:

注册名称 场景 所属模块 global beanFullName
party service test-party false test-party.service.party

使用Service

- 本模块内部调用

EggBornJS的Service一般在模块内部使用,通过ctx对象,访问的都是当前模块注册的Service

正是因为这种模块隔离设计,使得我们在大型业务开发过程中,不必担心其他模块是否也存在同名Service

使用举例:

src/suite-vendor/test-party/modules/test-party/backend/src/controller/party.js

  1. 1async types() {
  2. 2 const res = await this.ctx.service.party.types(this.ctx.request.body);
  3. 3 this.ctx.success(res);
  4. 4}

- 跨模块调用

EggBornJS的Service也允许跨模块调用,由于Service对应的Bean组件是app模式,为了确保ctx上下文的模块状态一致,需要使用ctx.executeBean,请参见:Bean