标识符
有两种方法创建一个标识符:
- 一个类可以用它本身作为标识符
- 调用
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
是合法的,这个小技巧能够将接口和标识符结合起来,降低开发者的心智负担。