Container 文档
Container#parent
public parent?: Container;
parent 是公开可访问的实例属性,用于指向父级容器,从而可以形成树状容器结构。
container.get
方法在执行过程中会默认在当前容器寻找指定 token,如果找不到该 token,则会默认向父级容器中寻找。
一直重复这个过程,直到父级容器不存在为止。
Container#get
function get<T>(
token: CommonToken<T>,
options: Options<T> & { optional: true }
): T | void;
function get<T>(
token: CommonToken<T>,
options?: Options<T> & { optional?: false }
): T;
function get<T>(token: CommonToken<T>, options?: Options<T>): T | void;
get 方法是 Container 最核心的方法,用于获取指定 token 对应的服务对象。当然前提是需要 Container 已经提前绑定了对应的 token。
options 中可以指定如下参数:
options.self; // 用于控制只在当前container中查询token
options.skipSelf; // 用于控制跳过当前container,从父级container中开始查询token
options.optional; // 当没有找到指定token时,默认时抛出异常,如果指定了options.optional=true,那么返回undefined
container.get
方法可以自动根据 token 的类型自动推导出类型 T,所以不需要手动指定类型 T。
需要注意如果指定了 options.optional=true,则 get 方法有可能返回 undefined,所以需要自行在运行时做判空处理。
get 方法在实例化过程中会触发如下声明周期方法,顺序如下:
- Binding#onActivationHandler
- Container#onActivationHandler
- Class#PostConstruct
对比 inversify 中的生命周期方法,顺序如下:
- Class#PostConstruct
- Binding#onActivationHandler
- Container#onActivationHandler
Container#bind
function bind<T>(token: CommonToken<T>): Binding<T>;
绑定指定的 token,并返回 Binding 对象。可以通过 Binding 对象关联对应的服务。这样就可以把 token 和服务关联起来了。
Container#unbind
function unbind<T>(token: CommonToken<T>): void;
解绑指定的 token,会触发相应的生命周期方法。执行顺序如下:
- Container#onDeactivationHandler
- Binding#onDeactivationHandler
- Class#PreDestroy
这里的顺序是和inversify 的执行顺序保持一致的。
Container#unbindAll
function unbindAll(): void;
会解绑容器内所有的 token,并触发对应的生命周期方法。
Container#isCurrentBound
function isCurrentBound<T>(token: CommonToken<T>): boolean;
判断当前容器是否绑定了指定的 token。
Container#isBound
function isBound<T>(token: CommonToken<T>): boolean;
判断当前容器以及所有父级容器是否绑定了指定的 token。
Container#createChild
function createChild(): Container;
快速创建一个子容器。过程如下:
const childContainer = new Container();
childContainer.parent = this;
return childContainer;
Container#destroy
function destroy(): void;
相对于 createChild 方法是创建一个新的容器,destroy 方法则负责销毁自身。 而且在 unbindAll 方法的基础上清除了所有自身的状态。
注意inversify
中并没有提供这个方法。
const parent = new Container();
const child = parent.createChild();
// 这里不仅仅销毁了自身容器的所有状态,而且将自己从parent容器的children属性中删除
child.destroy();
Container#onActivation
function onActivation(handler: ActivationHandler): void;
注册一个 Activation 函数,会在 get 方法首次执行过程中被执行。
注意只能注册一个 Activation 函数,重复注册,只会覆盖前一个函数。
这个 Activation 函数是当前 Container 的,当前 Container 的所有 token 都会使用这个 Activation 函数。
Container#onDeactivation
function onDeactivation(handler: DeactivationHandler): void;
注册一个 Deactivation 函数,会在 unbind 方法执行过程中被执行。
注意只能注册一个 Deactivation 函数,重复注册,只会覆盖前一个函数。
这个 Deactivation 函数是当前 Container 的,当前 Container 的所有 token 都会使用这个 Deactivation 函数。