Провайдери
Провайдери описують перелік методів ряду функціональності, які використовуються як в самому ядрі обчислень так і можуть використовуватись при описі бізнес-схеми. Вони не зберігають стану, а екземпляр провайдера створюється лише перед виконанням його методу, після чого знищується, очищуючи оперативну памʼять від цього екземпляра провайдера.
Архітектура
Провайдери не мають конфігураційних залежностей і функціонують як незалежні одиниці, не включені в життєвий цикл ядра обчислень. Це спрощує їх використання та впровадження. Провайдери які призначені, для використання виключно в бізнес-схемі, такі як провайдер прав доступу, провайдер сесій тощо - використовують тунелі взаємодії зі зʼєднувачами. Таким чином в залежності від простору використання провайдери можуть бути викликані в будь-якій частині програми, або тільки в бізнес-схемі.
Перелік провайдерів
X-Fiber підтримує наступний перелік фабрик:
| Назва | Опис |
|---|---|
| ExceptionProvider | Опис структур помилок та надання переліку методів для створення помилок та виключень в ядрі обчислень та в бізнес-схемі |
| CacheProvider | Використовує RedisTunnel для надання переліку методів для роботи з кешуванням даних та ресурсів. |
| LocalizationProvider | Надання переліку методів для роботи зі словниками перекладу та кінцевими ресурсами. |
| SessionProvider | Використовує RedisTunnel для надання переліку методів по використанню сесій користувачів чи систем |
| PermissionProvider | Використовує RedisTunnel для надання переліку методів по роботі з ролями, правами доступу тощо. |
У майбутніх версіях 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,
});
}
}
}