Завантажувачі
Завантажувачі сприяють формуванню уніфікованої бізнес-структури, зрозумілої для ядра відображень. Цей процес включає реєстрацію сервісів, областей застосування та документів, які детально описують предметну область.
Архітектура
Кожен завантажувач спеціалізується на побудові єдиної структури бізнес-схеми, незалежно від процесу об'єднання властивостей сервісу, прикладної області чи документа під час опису бізнес-схеми. Так, при реєстрації сервісу - в бізнес-схемі буде доданий елемент колекції - сервіс, з пустим переліком предметних областей, які будуть додані, в разі реєстрації предметних областей всередині цього сервісу. При реєстрації документів в предметній області, буде доданий в ідповідний документ в обʼєкт опису предметної області. У процесі створення бізнес-схеми мінімізується використання надлишкових абстракцій та шаблонного коду.
Наразі виключно завантажувач бізнес-схеми здійснює обробку бізнес-структури. Проте в майбутніх версіях планується додати можливість створення документації для сервісів. Ця функціональність буде реалізована через завантажувачі документації, які можуть працювати через окремий сервер або взаємодіяти з ядром обчислень для генерації єдиної документації веб-застосунку.
Застосування
Завантажувачі використовуються виключно у ядрі відображення і лише в рамках роботи сервісу бізнес-схеми. Под альша обробка схеми визначається функціоналом самого сервісу бізнес-схеми. При оновленні бізнес-схеми процедура формування та запису до сервісу бізнес-схеми повторюється.
Приклад опису завантажувача бізнес-схеми виглядає так:
// ** loaders.d.ts */
export namespace NSchemeLoader {
export type ServiceStructure = {
// ... service structure
}
}
// ** loaders.ts */
import { inversify } from '~packages'
import type { ISchemeLoader, NSchemaLoader } from '~types'
const { injectable } = inversify
@injectable()
export class SchemeLoader implements ISchemeLoader {
// other class structure
public setBusinessLogic(services: NSchemaLoader.ServiceStructure[]): void {
services.forEach((service) => {
service.domains.forEach((domain) => {
const name = domain.domain;
const { documents } = domain;
this._setDomain(name);
if (documents.router) {
this._setRouter(name, documents.router);
}
if (documents.views) {
if (Array.isArray(documents.views)) {
documents.views.forEach((v) => this._setView(name, v));
} else {
this._setView(name, documents.views);
}
}
if (documents.dictionaries) {
if (Array.isArray(documents.dictionaries)) {
documents.dictionaries.forEach((v) => this._setDictionary(name, v));
} else {
this._setDictionary(name, documents.dictionaries);
}
}
if (documents.store) {
this._setStore(name, documents.store);
}
if (documents.emitter) {
this._setEmitter(name, documents.emitter);
}
this._applyDomainToService(service.service, domain.domain);
});
});
}
private _applyDomainToService(service: string, domain: string): void {
const sStorage = this.services.get(service);
if (!sStorage) {
this.services.set(
service,
new Map<string, NSchemaLoader.DomainStorage>()
);
this._applyDomainToService(service, domain);
return;
}
const dStorage = this._domains.get(domain);
if (!dStorage) {
throw new Error(`Domain ${domain} not found`);
}
sStorage.set(domain, dStorage);
}
// other methods
}
де:
SchemeLoader- клас завантажувачі бізнес-схеми.setBusinessLogic- публічний метод для передачі групи сервісів з бізнес-схеми._applyDomainToService- приватний метод створення запису нової прикладної області