DescriptorImpl.ts
63 lines
| 1.7 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r1 | import { Descriptor, ILifetime, ConfigurableKeys, Resolver } from "./interfaces"; | ||
| import { ActivationContext } from "./ActivationContext"; | ||||
| import { ContextResolver } from "./ContextResolver"; | ||||
| import { each } from "./traits"; | ||||
| export type RegistrationOverridesMap<S extends object> = { [k in ConfigurableKeys<S>]?: Descriptor<S, NonNullable<S[k]>> }; | ||||
|
|
r0 | |||
| export interface DescriptorImplArgs<S extends object, T> { | ||||
|
|
r1 | lifetime: ILifetime<T>; | ||
|
|
r0 | |||
| factory: (resolve: Resolver<S>) => T; | ||||
| cleanup?: (item: T) => void; | ||||
|
|
r1 | overrides?: RegistrationOverridesMap<S>; | ||
|
|
r0 | } | ||
|
|
r1 | |||
|
|
r0 | export class DescriptorImpl<S extends object, T> implements Descriptor<S, T> { | ||
|
|
r1 | private readonly _overrides?: RegistrationOverridesMap<S>; | ||
|
|
r0 | |||
|
|
r1 | private readonly _lifetime: ILifetime<T>; | ||
|
|
r0 | |||
| private readonly _factory: (resolve: Resolver<S>) => T; | ||||
| private readonly _cleanup?: (item: T) => void; | ||||
| constructor(args: DescriptorImplArgs<S, T>) { | ||||
| this._lifetime = args.lifetime; | ||||
| this._factory = args.factory; | ||||
| if (args.cleanup) | ||||
| this._cleanup = args.cleanup; | ||||
| if (args.overrides) | ||||
| this._overrides = args.overrides; | ||||
| } | ||||
| activate(context: ActivationContext<S>): T { | ||||
| if (this._lifetime.has()) | ||||
| return this._lifetime.get(); | ||||
| this._lifetime.initialize(context); | ||||
| if (this._overrides) | ||||
| each(this._overrides, (v, k) => context.register(k, v)); | ||||
|
|
r1 | |||
| const resolver = new ContextResolver(context); | ||||
|
|
r0 | |||
|
|
r1 | |||
| const instance = this._factory.call(undefined, resolver.resolve.bind(resolver)); | ||||
|
|
r0 | |||
| this._lifetime.store(instance, this._cleanup); | ||||
| return instance; | ||||
| } | ||||
|
|
r1 | |||
|
|
r0 | toString() { | ||
|
|
r1 | return `[object DescriptorImpl, lifetime=${String(this._lifetime)}]`; | ||
|
|
r0 | } | ||
| } | ||||
