node-microsvc-lib
Version:
NodeJS microservice framework library
71 lines • 2.67 kB
JavaScript
/**
* 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