BaseObject.js

155 lines | 4.228 kB Blame History Raw Download

import { ErrorEntity, ArgumentErrorEntity } from '../Entities/Error/ErrorEntity';

/**
 * Данные о параметре, который необходимо получить через DI
*/
export class DependencyInfo
{

/**
* @param {string} parameterName Имя параметра
* @param {any} parameterValue Значенеи параметра
 *@param {any} dependencyConstructorParameter Параметр, передаваемый в конструктор зависимости
*/
    constructor(
        fieldName,
        dependencyName,
        dependencyConstructorParameter = null
    ) 
    {
        this.FieldName = fieldName;
        this.DependencyName = dependencyName;
        this.DependencyConstructorParameter = dependencyConstructorParameter;
    }
}


/**
 * Базовый класс для всех объектов приложения
 * Реализует получение необходимых зависимостей.
*/
export class BaseObject {
    static AbstractionName = 'BaseObject';

    static ServiceLocator;
    static Init(serviceLocator) {

        if (serviceLocator === null
            || serviceLocator === undefined) {

            let ex = new ErrorEntity(ErrorEntity.Exception, 'serviceLocator is empty')
                .SetClassName(BaseObject.AbstractionName)
                .SetMethodName('static Init');

            console.error(ex);
            throw ex;
        }

        BaseObject.ServiceLocator = serviceLocator;
    }


    /**
     * Базовый класс/интерфейс для всех классовых
     * Поддерживает:
     * имя класса
     * проверка, что параметры конструктора не пустые
     * 
     * 
    * @param {string} className Имя класса реализации
    * @param {string} abstractClassName Имя абстаркции, расположенной наиболее близко к конкретному экземпляру
    * @param {DependencyInfo[]} constructorParameters Список параметров конструктора для проверки
    */
    constructor(
        className,
        abstractClassName = null,
        objectDependencies = null
    ) {
        this.ClassName = className;
        this.AbstractClassName = abstractClassName !== null
            ? abstractClassName
            : BaseObject.AbstractionName;

        this._TestClassName(className, this.AbstractClassName);
        this._FillDependency(objectDependencies);
    }



    /**
     * Проверка параметра className
     * */
    _TestClassName(className, abstractClassName) {
        if (className === "") {

            throw new
                ArgumentErrorEntity('classname is empty')
                .SetAbstacrtClassName(abstractClassName)
                .SetClassName(className)
                .SetMethodName('TestClassName');

        }
    }

    /**
     * Заполняем зависимости объекта на основе массива constructorParameters
     * */
    _FillDependency(objectDependencies) {

        let th = this;

        if (objectDependencies === null) {
            return;
        }

        objectDependencies.forEach(function (elem, i, arr) {

            //Получаем зависимость
            let dependencyObject =
                elem.DependencyConstructorParameter === null
                    ? BaseObject.ServiceLocator
                        .Get(elem.DependencyName)
                    : BaseObject.ServiceLocator
                        .Get(elem.DependencyName, elem.DependencyConstructorParameter);

            //Проверяем, что зависимость не пустая
            if (dependencyObject === null
                || dependencyObject === undefined) {

                throw new
                    ErrorEntity(
                        ErrorEntity.Exception,
                        'Dependecy ' + elem.DependencyName + ' is empty'
                    )
                    .SetClassName(th.ClassName)
                    .SetAbstacrtClassName(th.abstractClassName)
                    .SetMethodName('_FillDependency');
            }

            //Сохраняем зависимость
            th[elem.FieldName] = dependencyObject;
        }
        );
    }


    /**
     * Для абстракций: декларирование методов.
     * Бросает ошибку: указанный метод не реализован
    * */
    ThrowNotImplementationError(methodName) {

        let error = new ErrorEntity(
            ErrorEntity.NotImplementationException,
            'Method ' + methodName + ' not implemented'
        )
            .SetAbstacrtClassName(this.AbstractClassName)
            .SetClassName(this.ClassName)
            .SetMethodName(methodName);

        throw error;
    }

}