Skip to content

标识符

有两种方法创建一个标识符:

  • 一个类可以用它本身作为标识符
  • 调用 createIdentifier 函数创建标识符

类作为标识符

一个类可以作为其自身的标识符:

class ClassDependency {}
const injector = new Injector([[ClassDependency]])

所以,你可以直接用类作为标识符从注入器获取一个实例:

const classDependency = injector.get(ClassDependency)

这是最简单的方法,不过这也意味着没有抽象,降低了依赖注入带来的灵活性。

createIdentifier

更推荐的做法是通过 createIdentifier 方法创建标识符,该标识符的类型是 IdentifierDecorator。在下面这个例子中,我们创建了一个名为 IPlatformService 的标识符,然后在提供该标识符对应的依赖时,选择具体的类 PcPlatformService

interface IPlatformService {
getUniqID(): string
}
const IPlatformService = createIdentifier<IPlatformService>('platform')
class PcPlatformService implements IPlatformService {}
const injector = new Injector([[IPlatformService, { useClass: PcPlatformService }]])
const platformIns = injector.get(IPlatformService)

使用这种方法的好处包括:

  • 符合依赖倒置原则,这样当你需要更改 IPlatformService 的实现时,就不必更改其他的依赖项
  • 标识符可以用作装饰器来声明依赖项之间的依赖关系

💡
在 TypeScript 当中,类型变量和值变量使用不同的命名空间,所以一个接口和一个值有完全相同的名称 IPlatformService 是合法的,这个小技巧能够将接口和标识符结合起来,降低开发者的心智负担。