Skip to content

注册类实例

介绍

awe-axios实现了依赖注入(DI)思想进行了实现,通过 @Component 装饰器,你可以把你要的类实例注册到容器中从而实现控制反转(IOC)。这样,你可以在其他类中通过 @Inject 装饰器注入你注册的类实例,实现解耦和可测试。

多种注册方式

类实例的注册主要通过 @Component 装饰器来实现,并提供了多种注册方式:

指定模块和别名

在将类实例注入容器时,你可以提供modulealias参数,指定模块名和别名,模块名其实就是充当命名空间的作用,主要防止在monorepo架构中不同模块出现同名类名冲突。如下所示:

typescript
import { Component } from './core/ioc';

// 自定义模块和别名
@Component({
  module: 'service', // 模块名
  alias: 'userApi', // 别名
})
class UserService {
  // ...
}

如果你不提供任何配置参数,实例类会默认注册到名为__default__的模块,并以类名首字母小写的形式作为别名。

typescript
import { Component } from './core/ioc';

// 默认注册等价于 @Component({ module: '__default__', alias: 'userService' })
@Component()
class UserService {
  // ...
}

字符串表达式注册

awe-axios也支持通过字符串表达式快速配置(格式:模块.别名):

typescript
// 等价于 { module: 'service', alias: 'userApi' }
@Component('service.userApi')
class UserService {
  // ...
}

当然你也可以只提供别名,这样模块名默认为__default__

typescript
// 等价于 { module: '__default__', alias: 'userService' }
@Component('userService')
class UserService {
  // ...
}

默认注册

当然,你也可以不提供任何配置参数,这样实例类会默认注册到名为__default__的模块,并以类名首字母小写的形式作为别名,但是这样你需要承担命名冲突的风险:

typescript
import { Component } from './core/ioc';

// 默认注册:模块为__default__,别名为"userService"
@Component
class UserService {
  getUser() {
    return { id: 1, name: 'test' };
  }
}

限制

同一模块下类名排他性

awe-axios的容器是基于模块命名空间的,不同模块可以存在同名类或别名,但是同一模块下不允许出现两个有相同别名和类名的类实例。比如:

ts
@Component('userApi')
class UserApi {}
@Component('userApi')
class UserApi2 {}

这样会报错:Instance with alias or ctor or ctorName already exists in module

只能用于 ts 类

awe-axios是基于 typescript 开发的,所以只能用于 typescript 类,如果你使用其他语言,比如 javascript,就无法使用awe-axios了。当然我们也期待javascript原生能支持这种装饰器语法功能