【d4axios】之服务创建:@Service

332 阅读2分钟

既然是基于装饰器的axios,那么必然要先支持装饰器,而对于一般的项目来说,默认是未开启装饰器模式的。所以需要:

别忘了 在 tsconfig.json或者jsconfig.json 文件里开启对装饰器的支持:"experimentalDecorators":true

而后就可以开始创建服务了。

1. @Service()

该装饰器是基于class工作的,因此需要先创建一个class对象

import { Service } from 'd4axios'

@Service()
export class MyService { }

tips: 对于service文件的命名,建议使用 servicename.service.ts ,且文件内使用 export class ServiceName 的形式,这样导出时,方便语法解析器自动导入使用的服务。

service应该有独立文件夹,一般设置在src/services/下,对于不同的url可以使用文件夹以区分,比如user相关的操作,如果不完全在一个url下,可以使用 src/services/user/auth.service.tssrc/services/user/settings.service.ts将不同的目的和内容按照不同分类区分开,方便后期维护

@Service() 的两个参数为 name=""camelCase=true,当传入name时,name的值应该全局唯一,当不传入name时,将会自动生成name名称。第二个是使用驼峰命名法,将会在代码中使用:

name
    .split("_")
    .map((item, index) => item.replace(/^([a-zA-Z])/, i => index ? i.toUpperCase() : i.toLowerCase()))
    .join("")

_分隔符转变成大写标志,首字母将会被转为小写值。例如 :

  1. MyService 会被转化为 myService
  2. my_service 会被转化为 mySerivce

通常情况下可以省略name值,则该class会被标记为 __noname ,在某些特定场景下会做一定使用限制。

2. @RequestPrefix(string)

附加在当前api请求前的地址,和直接写在api地址是一致的。url支持restful格式,使用 {keyname}包裹 比如:

import { Service } from 'd4axios'

@Service()
@RequestPrefix("/user/{id}")
export class MyService { }

代表每一个该服务下的请求都会在url前追加 /user/{id},url会追加在 MyService.__prefix下,最终会追加在 new MyService().__prefix下,id的值将会使用请求参数里的值覆盖。最终得到完整的请求url。

创建服务实际上是一个很简单的操作,如果你熟悉springmvc,就不难理解这里的创建逻辑,唯一和springmvc不一样的是,mvc使用的是bean的形式。

  1. 问:当服务放在services文件夹下后,是否可以自动注册服务?
    • 答:暂时还不行。尝试过编写webpack的loader,可能是我理解的不到位,能力优先暂时无法支持。或许后面会有办法。
  2. 问:对于service的配置参数还会有哪些?
    • 答:还会对服务的权限做限定操作。实际上相当于configs.routers的操作,只是范围更窄,核定范围更精确。后续将会提供一系列针对单个class的拦截操作,这样可以将配置弱化。支持更多的个性化定制需求。

如果还不知道如何入门使用,可以参照【d4axios】之初始化 createService