Сервіс комбінацій
У зв'язку з наявністю в ядрі обчислень різних рішень для вирішення одних і тих самих завдань, що описуються за допомогою
стратегій і подальшою конфігурацією фабрик, сервіс комбінацій CombinationService визначає послідовність виклику
фабрик та відповідно запускає конкретні стратегії або адаптери протоколів.
Архітектура
При описі кожної стратегії чи адаптеру, вона включається в відповідну фабрику, де задається вибір цієї стратегії. Кожна фабрика має метод run, що визначає запуск фабрики. Цей підхід дозволяє масштабувати як конкретні рішення, так і функціонал в цілому. Кожна фабрика базується на власних стратегіях, а сервіс комбінацій визначає послідовність застосування фабрик.
X-Fiber зосереджується на керуванні структурними модулями з метою підвищення безпеки та забезпечення передбачуваності
їх роботи. На цій меті використовуються такі абстрактні класи як AbstractConnector, який визначає правила роботи
з'єднувачів, AbstractService, що визначає роботу сервісів, AbstractFactory, що встановлює структуру фабрик,
AbstractAdapter, який описує кожен адаптер, та власний AbstractStrategy для кожної групи стратегій.
Застосування
Сервіс комбінацій, в якості внутрішнього сервісу ядра обчислень, спеціалізується на конфігурації фабрик, які мають однаковий інтерфейс запуску та зупинки роботи фабрики. Перелік методів для кожної стратегії описується у вигляді абстрактних стратегій, що в подальшому передається відповідному агенту функціональності. Це забезпечує можливість їх подальшого використання при розробці бізнес-схем.
import { inversify } from '~packages';
import { AbstractService } from './abstract.service';
import type {
IAbstractService,
IDiscoveryService,
ILoggerService,
IAbstractFactory
} from '~types'
const { injectable } = inversify;
@injectable()
export class CombinationService extends AbstractService implements IAbstractService {
protected readonly _SERVICE_NAME = CombinationService.name;
constructor(
@inject(CoreSymbols.DiscoveryService)
protected readonly _discoveryService: IDiscoveryService,
@inject(CoreSymbols.LoggerService)
protected readonly _loggerService: ILoggerService,
@inject(CoreSymbols.HttpAdapterFactory)
private readonly _httpAdapterFactory: IAbstractFactory,
@inject(CoreSymbols.WsAdapterFactory)
private readonly _wsAdapterFactory: IAbstractFactory,
) {
super();
}
protected async init(): Promise<boolean> {
try {
await this._httpAdapterFactory.run();
await this._wsAdapterFactory.run();
return true;
} catch (e) {
this._loggerService.error(e)
return false
}
}
protected async destroy(): Promise<void> {
try {
await this._httpAdapterFactory.stay();
await this._wsAdapterFactory.stay();
} catch (e) {
this._loggerService.error(e)
}
}
}