UNPKG

pip-services3-commons-node

Version:
242 lines 9.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** @module refer */ var StringConverter_1 = require("../convert/StringConverter"); var ReferenceException_1 = require("./ReferenceException"); var Descriptor_1 = require("./Descriptor"); /** * Helper class for resolving component dependencies. * * The resolver is configured to resolve named dependencies by specific locator. * During deployment the dependency locator can be changed. * * This mechanism can be used to clarify specific dependency among several alternatives. * Typically components are configured to retrieve the first dependency that matches * logical group, type and version. But if container contains more than one instance * and resolution has to be specific about those instances, they can be given a unique * name and dependency resolvers can be reconfigured to retrieve dependencies by their name. * * ### Configuration parameters ### * * dependencies: * - [dependency name 1]: Dependency 1 locator (descriptor) * - ... * - [dependency name N]: Dependency N locator (descriptor) * * ### References ### * * References must match configured dependencies. * * ### Example ### * * class MyComponent: IConfigurable, IReferenceable { * private _dependencyResolver: DependencyResolver = new DependencyResolver(); * private _persistence: IMyPersistence; * ... * * public constructor() { * this._dependencyResolver.put("persistence", new Descriptor("mygroup", "persistence", "*", "*", "1.0")); * } * * public configure(config: ConfigParams): void { * this._dependencyResolver.configure(config); * } * * public setReferences(references: IReferences): void { * this._dependencyResolver.setReferences(references); * this._persistence = this._dependencyResolver.getOneRequired<IMyPersistence>("persistence"); * } * } * * // Create mycomponent and set specific dependency out of many * let component = new MyComponent(); * component.configure(ConfigParams.fromTuples( * "dependencies.persistence", "mygroup:persistence:*:persistence2:1.0" * // Override default persistence dependency * )); * component.setReferences(References.fromTuples( * new Descriptor("mygroup","persistence","*","persistence1","1.0"), new MyPersistence(), * new Descriptor("mygroup","persistence","*","persistence2","1.0"), new MyPersistence() * // This dependency shall be set * )); * * @see [[IReferences]] */ var DependencyResolver = /** @class */ (function () { /** * Creates a new instance of the dependency resolver. * * @param config (optional) default configuration where key is dependency name and value is locator (descriptor) * @param references (optional) default component references * * @see [[ConfigParams]] * @see [[configure]] * @see [[IReferences]] * @see [[setReferences]] */ function DependencyResolver(config, references) { this._dependencies = {}; if (config != null) this.configure(config); if (references != null) this.setReferences(references); } /** * Configures the component with specified parameters. * * @param config configuration parameters to set. * * @see [[ConfigParams]] */ DependencyResolver.prototype.configure = function (config) { var dependencies = config.getSection("dependencies"); var names = dependencies.getKeys(); for (var index = 0; index < names.length; index++) { var name_1 = names[index]; var locator = dependencies.get(name_1); if (locator == null) continue; try { var descriptor = Descriptor_1.Descriptor.fromString(locator); if (descriptor != null) this._dependencies[name_1] = descriptor; else this._dependencies[name_1] = locator; } catch (ex) { this._dependencies[name_1] = locator; } } }; /** * Sets the component references. References must match configured dependencies. * * @param references references to set. */ DependencyResolver.prototype.setReferences = function (references) { this._references = references; }; /** * Adds a new dependency into this resolver. * * @param name the dependency's name. * @param locator the locator to find the dependency by. */ DependencyResolver.prototype.put = function (name, locator) { this._dependencies[name] = locator; }; /** * Gets a dependency locator by its name. * * @param name the name of the dependency to locate. * @returns the dependency locator or null if locator was not configured. */ DependencyResolver.prototype.locate = function (name) { if (name == null) throw new Error("Dependency name cannot be null"); if (this._references == null) throw new Error("References shall be set"); return this._dependencies[name]; }; /** * Gets all optional dependencies by their name. * * @param name the dependency name to locate. * @returns a list with found dependencies or empty list of no dependencies was found. */ DependencyResolver.prototype.getOptional = function (name) { var locator = this.locate(name); return locator != null ? this._references.getOptional(locator) : null; }; /** * Gets all required dependencies by their name. * At least one dependency must be present. * If no dependencies was found it throws a [[ReferenceException]] * * @param name the dependency name to locate. * @returns a list with found dependencies. * * @throws a [[ReferenceException]] if no dependencies were found. */ DependencyResolver.prototype.getRequired = function (name) { var locator = this.locate(name); if (locator == null) throw new ReferenceException_1.ReferenceException(null, name); return this._references.getRequired(locator); }; /** * Gets one optional dependency by its name. * * @param name the dependency name to locate. * @returns a dependency reference or null of the dependency was not found */ DependencyResolver.prototype.getOneOptional = function (name) { var locator = this.locate(name); return locator != null ? this._references.getOneOptional(locator) : null; }; /** * Gets one required dependency by its name. * At least one dependency must present. * If the dependency was found it throws a [[ReferenceException]] * * @param name the dependency name to locate. * @returns a dependency reference * * @throws a [[ReferenceException]] if dependency was not found. */ DependencyResolver.prototype.getOneRequired = function (name) { var locator = this.locate(name); if (locator == null) throw new ReferenceException_1.ReferenceException(null, name); return this._references.getOneRequired(locator); }; /** * Finds all matching dependencies by their name. * * @param name the dependency name to locate. * @param required true to raise an exception when no dependencies are found. * @returns a list of found dependencies * * @throws a [[ReferenceException]] of required is true and no dependencies found. */ DependencyResolver.prototype.find = function (name, required) { if (name == null) throw new Error("Name cannot be null"); var locator = this.locate(name); if (locator == null) { if (required) throw new ReferenceException_1.ReferenceException(null, name); return null; } return this._references.find(locator, required); }; /** * Creates a new DependencyResolver from a list of key-value pairs called tuples * where key is dependency name and value the depedency locator (descriptor). * * @param tuples a list of values where odd elements are dependency name and the following even elements are dependency locator (descriptor) * @returns a newly created DependencyResolver. * * @see [[fromTuplesArray]] */ DependencyResolver.fromTuples = function () { var tuples = []; for (var _i = 0; _i < arguments.length; _i++) { tuples[_i] = arguments[_i]; } var result = new DependencyResolver(); if (tuples == null || tuples.length == 0) return result; for (var index = 0; index < tuples.length; index += 2) { if (index + 1 >= tuples.length) break; var name_2 = StringConverter_1.StringConverter.toString(tuples[index]); var locator = tuples[index + 1]; result.put(name_2, locator); } return result; }; return DependencyResolver; }()); exports.DependencyResolver = DependencyResolver; //# sourceMappingURL=DependencyResolver.js.map