##// END OF EJS Templates
sync
sync

File last commit:

r15:3985e8405319 tip default
r15:3985e8405319 tip default
Show More
ContainerBuilder.ts
56 lines | 1.7 KiB | video/mp2t | TypeScriptLexer
/ src / main / ts / ContainerBuilder.ts
import { Container } from "./Container";
import { DescriptorBuilder } from "./DescriptorBuilder";
import { Descriptor, IContainerBuilder, IDescriptorBuilder, DescriptorMap, ServiceLocator, ILifetimeManager } from "../typings/interfaces";
/**
* Container builder used to prepare service descriptors and create a IoC container
*/
export class ContainerBuilder<S, U extends keyof S> implements
IContainerBuilder<S, U> {
private _pending = 1;
private readonly _services: DescriptorMap<S>;
private readonly _scope: ILifetimeManager[];
private readonly _level: number;
constructor(parentServices: DescriptorMap<S> | null, scope: ILifetimeManager[] = []) {
this._services = { ...parentServices }; // create a copy
this._level = scope.length;
this._scope = scope;
}
createServiceBuilder<K extends U>(name: K): IDescriptorBuilder<S, S[K], Record<never, never>, U> {
return new DescriptorBuilder(this._level, String(name), this._register(name), this._fail);
}
build(): ServiceLocator<S> {
this._assertBuilding();
if (!this._complete())
throw new Error("The configuration didn't complete.");
return new Container(this._services, this._scope);
}
private readonly _register = <K extends U>(name: K) =>
(descriptor: Descriptor<S, S[K]>) => {
this._complete();
this._services[name] = descriptor;
};
private readonly _fail = (ex: unknown) => {
throw ex;
};
private _assertBuilding() {
if (!this._pending)
throw new Error("The descriptor builder is finalized");
}
private _complete() {
return !(--this._pending);
}
}