UNPKG

@web-atoms/core

Version:
63 lines (49 loc) 1.77 kB
import { ArrayHelper } from "../core/types"; import { ServiceProvider } from "./ServiceProvider"; import { TypeKey } from "./TypeKey"; export type ServiceFactory = (sp: ServiceProvider) => any; export enum Scope { Global = 1, Scoped = 2, Transient = 3 } export class ServiceDescription { constructor( public id: string, public scope: Scope, public type: any, public factory: ServiceFactory ) { this.factory = this.factory || ((sp) => { return (sp as any).create(type); }); } } export class ServiceCollection { public static instance: ServiceCollection = new ServiceCollection(); private registrations: ServiceDescription[] = []; private ids: number = 1; public register( type: any, factory: ServiceFactory, scope: Scope = Scope.Transient, id?: string): ServiceDescription { ArrayHelper.remove(this.registrations, (r) => id ? r.id === id : r.type === type); if (!id) { id = TypeKey.get(type); this.ids ++; } const sd = new ServiceDescription(id, scope, type, factory); this.registrations.push(sd); return sd; } public registerScoped(type: any, factory?: ServiceFactory, id?: string): ServiceDescription { return this.register(type, factory, Scope.Scoped, id); } public registerSingleton(type: any, factory?: ServiceFactory, id?: string): ServiceDescription { return this.register(type, factory, Scope.Global, id); } public get(type: any): ServiceDescription { return this.registrations.find( (s) => s.id === type || s.type === type); } }