UNPKG

node-microsvc-lib

Version:
71 lines 2.67 kB
/** * Created by pedrosousabarreto@gmail.com on 15/Jan/2019. */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiContainer = void 0; const console_logger_1 = require("./console_logger"); class DiContainer { constructor(logger) { this._dependencies = new Map(); this._factories = new Map(); if (!logger) this._di_logger = new console_logger_1.ConsoleLogger().create_child({ class: "DiContainer" }); else this._di_logger = logger.create_child({ class: "DiContainer" }); } register_factory(name, factory) { this._check_duplicate_name(name); // TODO check that it implements IDiFactory this._di_logger.info("DI Container - registering factory: %s", name); this._factories.set(name, factory); } register_dependency(name, dep) { this._check_duplicate_name(name); this._di_logger.info("DI Container - registering dependency: %s", name); this._dependencies.set(name, dep); } ; has(name) { return (this._dependencies.has(name) || this._factories.has(name)); } get(name) { name = name.trim(); if (!this._dependencies.has(name)) { const uninitialised_factory = this._factories.get(name); if (uninitialised_factory) { this._di_logger.info("DI Container - injecting factory: %s", name); this._dependencies.set(name, this._inject(uninitialised_factory)); } if (!this._dependencies.has(name)) throw new Error("DI Container - cannot find module: " + name); } return this._dependencies.get(name); } _check_duplicate_name(name) { if (!this.has(name)) return; const err = new Error(`Di Container - already has an object named ${name}`); this._di_logger.fatal(err); throw err; } _inject(factory) { // @ts-ignore let ctor = factory.prototype.constructor.toString(); let args_list = ctor.match(/constructor\s?\(([^)]*)\)/).splice(1)[0]; if (!args_list) return new factory(); // args_list = args_list.replace(" ", ""); let args_array = args_list.split(","); // if (args_array.length <= 0) // return new (<any>factory)(); // map them to the dependencies/factories let args = args_array.map((dependency) => { return this.get(dependency); }); // instantiate and return return new factory(...args); } } exports.DiContainer = DiContainer; //# sourceMappingURL=di_container.js.map