什么是 Token
这里的 token 并不是最近比较火的 AI 中的 token 的概念。而是依赖注入背景下的 token。
token 就是一个普通变量,容器首先将 token 与某服务绑定,后续容器可以通过 token 获取服务对象。
可以参考这里:
解释
首先看一个简单的基于 Map 的例子。
从例子中可以看出 token 其实就是引用特定服务的一个 key,用以后续保存/获取特定服务。
ts
const map = new Map();
const serviceValue = '任意数据';
const token = 'token-name';
// 通过token保存serviceValue的引用
map.set(token, serviceValue);
// 通过token获取serviceValue
const value = map.get(token);
再来看看基于 Container 的例子。
ts
const container = new Container();
const serviceValue = '任意数据';
// 这里使用new Token是因为本库不支持字符串作为token
// 不过inversify是支持字符串作为token的,所以这一点完全取决于不同库的取舍
const token = new Token<string>('token-name');
// 绑定token和serviceValue的关联关系
container.bind(token).toConstantValue(serviceValue);
// 通过token获取serviceValue
const value = container.get(token);
为什么不直接使用 serviceValue 这个变量名来引用这个服务呢?
总结一句话就是直接使用变量的适用场景有限,使用独立的 token 来关联服务具有更强的灵活性。
直接使用变量,意味着该服务是全局单例模式的,这样才方便其他地方可以 import 使用。所以变量就不适用于产生多个实例的场景。
服务的初始化逻辑并不一定在定义变量时就已经明确了。假设某个业务知道一定依赖一个 A 服务,但是 A 服务怎么实现暂时还不知道。
上面的例子只是简单的关联了 token 和服务,那么在获取服务时,就是简单的返回该服务。但是实际上 Container 还支持其他不同的关联方式,从而支持不同的服务初始化逻辑。Container 还具有其他很多特性,这些特性也是直接使用变量所没有的。