##// END OF EJS Templates
Added childContainer service to container services, ServiceContaier is destroyable, fixed browser Uuid version
Added childContainer service to container services, ServiceContaier is destroyable, fixed browser Uuid version

File last commit:

r144:f97a113c3209 v1.4.0-rc4 default
r146:f3f5c56d3b3e v1.4.0-rc5 default
Show More
FluentConfiguration.ts
68 lines | 2.3 KiB | video/mp2t | TypeScriptLexer
/ src / main / ts / di / fluent / FluentConfiguration.ts
import { argumentNotNull, each, isPrimitive, isPromise } from "../../safe";
import { DescriptorBuilder } from "./DescriptorBuilder";
import { RegistrationBuilder, FluentRegistrations, ContainerConfiguration } from "./interfaces";
import { Cancellation } from "../../Cancellation";
import { ServiceContainer } from "../interfaces";
export class FluentConfiguration<S extends object, Y extends keyof S = keyof S> {
_builders: { [k in keyof S]?: RegistrationBuilder<S, S[k]> } = {};
provided<K extends Y>(): FluentConfiguration<S, Exclude<Y, K>> {
return this;
}
register<K extends Y>(name: K, builder: RegistrationBuilder<S, S[K]>): FluentConfiguration<S, Exclude<Y, K>>;
register<K extends Y>(config: FluentRegistrations<K, S>): FluentConfiguration<S, Exclude<Y, K>>;
register<K extends Y>(nameOrConfig: K | FluentRegistrations<K, S>, builder?: RegistrationBuilder<S, S[K]>): FluentConfiguration<S, Exclude<Y, K>> {
if (isPrimitive(nameOrConfig)) {
argumentNotNull(builder, "builder");
this._builders[nameOrConfig] = builder;
} else {
each(nameOrConfig, (v, k) => this.register(k, v));
}
return this;
}
configure(config: FluentRegistrations<Y, S>): ContainerConfiguration<S> {
return this.register(config);
}
apply<S2 extends object>(target: ServiceContainer<S2>, ct = Cancellation.none) {
let pending = 1;
const _t2 = target as unknown as ServiceContainer<S2 & S>;
return new Promise<ServiceContainer<S2 & S>>((resolve, reject) => {
function guard(v: void | Promise<void>) {
if (isPromise(v))
v.catch(reject);
}
function complete() {
if (!--pending)
resolve(_t2);
}
each(this._builders, (v, k) => {
pending++;
const d = new DescriptorBuilder<S2 & S, any>(_t2,
result => {
_t2.register(k, result);
complete();
},
reject
);
try {
guard(v(d, ct));
} catch (e) {
reject(e);
}
});
complete();
});
}
}