BaseObject.js
Home
/
Src /
ReactDependecyInjection /
ClientApp /
src /
Model /
DI /
BaseObject.js
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;
}
}