Перейти до основного вмісту

Провайдери

інформація

Провайдери описують перелік методів ряду функціональності, які використовуються як в самому ядрі обчислень так і можуть використовуватись при описі бізнес-схеми. Вони не зберігають стану, а екземпляр провайдера створюється лише перед виконанням його методу, після чого знищується, очищуючи оперативну памʼять від цього екземпляра провайдера.

Архітектура

Провайдери не мають конфігураційних залежностей і функціонують як незалежні одиниці, не включені в життєвий цикл ядра обчислень. Це спрощує їх використання та впровадження. Провайдери які призначені, для використання виключно в бізнес-схемі, такі як провайдер прав доступу, провайдер сесій тощо - використовують тунелі взаємодії зі зʼєднувачами. Таким чином в залежності від простору використання провайдери можуть бути викликані в будь-якій частині програми, або тільки в бізнес-схемі.

providers-arch.svg

Перелік провайдерів

X-Fiber підтримує наступний перелік фабрик:

НазваОпис
ExceptionProviderОпис структур помилок та надання переліку методів для створення помилок та виключень в ядрі обчислень та в бізнес-схемі
CacheProviderВикористовує RedisTunnel для надання переліку методів для роботи з кешуванням даних та ресурсів.
LocalizationProviderНадання переліку методів для роботи зі словниками перекладу та кінцевими ресурсами.
SessionProviderВикористовує RedisTunnel для надання переліку методів по використанню сесій користувачів чи систем
PermissionProviderВикористовує RedisTunnel для надання переліку методів по роботі з ролями, правами доступу тощо.
warning

У майбутніх версіях v2.0.0, v3.0.0 ... vX.X.X планується впровадження провайдерів для обробки зображень, відео тощо.

Застосування

Опишемо застосування провайдерів на прикладі структури провайдера помилок та його використання:

1. Створення класу помилки та опис методу в провайдері помилок для його виклику:

// ** error.provider.d.ts */
import type { NLoggerService } from '../services'

export namespace NErrorProvider {
export type CoreError = {
namespace: string;
requestId?: string;
sessionId?: string;
tag?: string;
errorType: NLoggerService.ErrorType; // 'FATAL' | 'FAIL' | 'EXCEPTION' | 'CUSTOM';
};
}


// ** error.provider.ts */
import { injectable } from '~packages'

import type { ICoreError, IErrorProvider, NErrorProvider } from '~types'


class CoreError extends Error implements ICoreError {
public readonly namespace: string;
public readonly tag: string | undefined;
public readonly requestId: string | undefined;
public readonly sessionId: string | undefined;
public readonly trace: string | undefined;
public readonly msg: string | undefined;

constructor(message: string, options: NErrorProvider.CoreError) {
super(message);

this.namespace = options.namespace;
this.tag = options.tag;
this.requestId = options.requestId;
this.sessionId = options.sessionId;
this.trace = this.stack;
this.msg = this.message;

Object.setPrototypeOf(this, new.target.prototype);
Error.captureStackTrace(this);
}
}

@injectable()
export class ErrorProvider implements IErrorProvider {
// ... other methods

public throwError(
message: string,
options: NErrorProvider.CoreError
): ICoreError {
return new CoreError(message, options);
}

// ... other methods

}

2. Використання в ядрі обчислень:

import { CoreSymbols } from '~symbols'

import type { IMongoTunnel, Mongoose, IErrorProvider } from '~types'

@injectable()
export class MongoTunnel implements IMongoTunnel {
constructor(
@inject(CoreSymbols.MongodbConnector)
private readonly _mongodbConnector: IMongodbConnector,
// ... inject structure
) {
}

public async deleteOne<TRawDocType>(
model: string,
filter?: Mongoose.FilterQuery<TRawDocType>,
options?: Mongoose.QueryOptions<TRawDocType>
): Promise<Mongoose.DeleteOne<TRawDocType>> {
const errorProvider = container.get<IErrorProvider>(CoreSymbols.ErrorProvider)

const models = this._mongodabConnector.connection.models;
if (!models) {
throw errorProvider.throwError("Models not initialize", {
namespace: MongodbProvider.name,
errorType: "FAIL",
requestId: this._contextService.store.requestId,
});
}

try {
return options
? await models[model].deleteOne(filter, options)
: await models[model].deleteOne(filter);
} catch (e) {
throw errorProvider.throwError(e, {
namespace: MongodbProvider.name,
errorType: "FATAL",
requestId: this._contextService.store.requestId,
});
}
}
}