定义Service
Service
的定义方式与EggJS
一致
src/suite-vendor/test-party/modules/test-party/backend/src/service/party.js
- 1module.exports = app => {
- 2
- 3 class Party extends app.Service {
- 4
- 5 async types() {
- 6 const items = await this.ctx.model.partyType.select();
- 7 return items.map(item => {
- 8 return {
- 9 id: item.id,
- 10 name: this.ctx.text(item.name),
- 11 };
- 12 });
- 13 }
- 14
- 15 }
- 16
- 17 return Party;
- 18};
注册Service
与EggJS不同之处:EggJS约定了Service
的文件位置,在系统启动时自动加载。而EggBornJS的Service
需要通过require
显式注册,从而便于进行模块编译
src/suite-vendor/test-party/modules/test-party/backend/src/services.js
- 1const party = require('./service/party.js');
- 2
- 3module.exports = app => {
- 4 const services = {
- 5 party,
- 6 };
- 7 return services;
- 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
- 1async types() {
- 2 const res = await this.ctx.service.party.types(this.ctx.request.body);
- 3 this.ctx.success(res);
- 4}
- 跨模块调用
EggBornJS的Service
也允许跨模块调用,由于Service对应的Bean组件是app模式
,为了确保ctx上下文的模块状态一致,需要使用ctx.executeBean
,请参见:Bean
评论: